2017-06-03 5 views
1

Ich versuche eine Listbox zu erstellen, in der ich Objekte dynamisch hinzufügen oder entfernen kann.
Das Setup sieht wie folgt aus:
first box is an <code>edit text</code> box to enter a label name, second box is the listbox objectMatlab guide: Hinzufügen/Löschen von Elementen aus der Listbox

Leider - wie man es von dem Bild sehen kann - wenn ich Elemente die gesamte Länge der Liste gleich und statt bleibt löschen schrumpft die Liste der angezeigten Liste nun Löcher enthält .

Weiß jemand, wie man dieses Verhalten vermeidet?

Dies ist mein Code für die Löschtaste so weit:

function btnDeleteLabel_Callback(hObject, eventdata, handles) 
    selectedId = get(handles.listbox_labels, 'Value');  % get id of selectedLabelName 
    existingItems = get(handles.listbox_labels, 'String'); % get current listbox list 
    existingItems{selectedId} = [];     % delete the id 
    set(handles.listbox_labels, 'String', existingItems);  % restore cropped version of label list 

Antwort

2

Der einfachste Weg, um die „leeren“ Einträge zu entfernen, ist Update des listbox String mit dem remainig Artikel.

Es gibt drei Möglichkeiten:

  • das erste Element gelöscht wurde: die neue Liste upd_list={existingItems{2:end}}
  • das letzte Element wurde gelöscht sein wird: die neue Liste upd_list={existingItems{1:end-1}} wird
  • ans Zwischenelement wurde gelöscht: Die neue Liste wird upd_list={existingItems{1:selectedId-1} existingItems{selectedId+1:end}}

Sie können auch überprüfen, ob alle Elemente der Liste haben gelöscht worden ist und in diesem Fall die "Löschen" pushbutton deaktivieren; In diesem Fall müssen Sie es im "Add" callback aktivieren.

Eine mögliche Umsetzung Ihrer btnDeleteLabel_Callback könnten sein:

% --- Executes on button press in btnDeleteLabel. 
function btnDeleteLabel_Callback(hObject, eventdata, handles) 
% hObject handle to btnDeleteLabel (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

selectedId = get(handles.listbox_labels, 'Value')  % get id of selectedLabelName 
existingItems = get(handles.listbox_labels, 'String') % get current listbox list 
% 
% It is not necessary 
% 
% existingItems{selectedId} = []     % delete the id 

% Identify the items: if in the list only one ites has been added the 
% returned list is a char array 
if(class(existingItems) == 'char') 
    upd_list='' 
    set(handles.listbox_labels, 'String', upd_list) 
else 
    % If the returned list is a cell array there are three cases 
    n_items=length(existingItems) 
    if(selectedId == 1) 
     % The first element has been selected 
     upd_list={existingItems{2:end}} 
    elseif(selectedId == n_items) 
     % The last element has been selected 
     upd_list={existingItems{1:end-1}} 
     % Set the "Value" property to the previous element 
     set(handles.listbox_labels, 'Value', selectedId-1) 
    else 
     % And element in the list has been selected 
     upd_list={existingItems{1:selectedId-1} existingItems{selectedId+1:end}} 
    end 
end 
% Update the list 
set(handles.listbox_labels, 'String', upd_list)  % restore cropped version of label list 

% Disable the delete pushbutton if there are no more items 
existingItems = get(handles.listbox_labels, 'String') 
if(isempty(existingItems)) 
    handles.btnDeleteLabel.Enable='off' 
end 

enter image description here

hoffe, das hilft,

Qapla‘

Verwandte Themen