Matlab指南:从列表框中添加/删除项目

时间:2017-06-03 10:30:54

标签: matlab listbox matlab-guide

我正在尝试创建一个列表框,我可以动态添加或删除项目 设置如下:
first box is an <code>edit text</code> box to enter a label name, second box is the listbox object

不幸的是 - 从图片中可以看出 - 当我删除元素时,列表的总长度保持不变,而不是缩小列表,显示的列表现在包含空洞。

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

到目前为止,这是我删除按钮的代码:

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 个答案:

答案 0 :(得分:2)

删除&#34;空&#34;的最简单方法entries将使用remainingig项更新listbox字符串。

有三种可能性:

  • 第一个元素已被删除:新列表将为upd_list={existingItems{2:end}}
  • 最后一个元素已被删除:新列表将为upd_list={existingItems{1:end-1}}
  • ans中间元素已被删除:新列表将为upd_list={existingItems{1:selectedId-1} existingItems{selectedId+1:end}}

您还可以检查列表中的所有元素是否已被删除,在这种情况下,请禁用&#34;删除&#34; pushbutton;在这种情况下,您必须在&#34;添加&#34; 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&#39;

答案 1 :(得分:0)

只需用正常括号替换单元格括号:

%existingItems{selectedId} = []; % replace this with next line
existingItems(selectedId) = [];