2017-06-03 307 views
1

我想创建一个列表框,我可以动态地添加或删除项目。
的设置是这样的:
first box is an <code>edit text</code> box to enter a label name, second box is the listbox objectMatlab指南:添加/删除列表框中的项目

不幸的是 - 作为一个从图片中可以看到 - 当我删除元素列表的总长度保持不变,而不是和收缩列表中显示的列表现在包含孔。

有谁知道如何避免这种行为?

这是我的删除按钮的代码至今:

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 

回答

2

删除“空”项中的simpliest办法就是更新listbox字符串与remainig项目。

有三种可能性:

  • 的第一个元素已被删除:新的名单将在upd_list={existingItems{2:end}}
  • 的最后一个元素已被删除:新的名单将在upd_list={existingItems{1:end-1}}
  • ANS中间元件已被删除:新的名单将在upd_list={existingItems{1:selectedId-1} existingItems{selectedId+1:end}}

您还可以检查列表的所有元素都被删除,在这种情况下,禁用“删除”pushbutton;在这种情况下,您必须在“添加”callback中启用它。

一种可能实现你的btnDeleteLabel_Callback的可能是:

% --- 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

希望这有助于

Qapla”

相关问题