我创建了一个listbox
并启用了多项选择。我listbox
包含从 1 到 10 的数字。当我选择 3、1 和 8 时,该函数始终按字母顺序(1、3、8)排列我的选择。有什么办法可以让它不按字母顺序排列我的选择吗?因此,如果我选择 3、1 和 8,我选择的输出是 3、1、8。
谢谢你。
我创建了一个listbox
并启用了多项选择。我listbox
包含从 1 到 10 的数字。当我选择 3、1 和 8 时,该函数始终按字母顺序(1、3、8)排列我的选择。有什么办法可以让它不按字母顺序排列我的选择吗?因此,如果我选择 3、1 和 8,我选择的输出是 3、1、8。
谢谢你。
出于此答案的目的,我假设您正在使用matlab-hg2。
从文档中uicontrol
:
'listbox'
... 该Value
属性存储当前选中的列表框项的行索引,当您选择多个项目时是一个向量值。在发生任何更改Value
属性的鼠标按钮事件后,MATLAB 会计算列表框的回调例程。要在可以选择多个项目时延迟操作,您可以将“完成”按钮与列表框相关联。使用该按钮的回调来评估列表框Value
属性。
从上面我们了解到,所选行的信息是在 中返回的Value
。从那里开始,就是跟踪所选内容的问题。这可以很容易地使用persistent
列表框中的变量来完成Callback
,如下例所示:
function LISTBOX_EXAMPLE
hFig = figure('Units','Pixels','Position', [200 200 100 200],'Menubar','none');
uicontrol(hFig, ...
'Style', 'listbox',...
'Units','Pixels',...
'Position', [20 20 80 150],...
'Max',3,...
'Min',0,...
'String',num2cell(1:10),...
'Callback',@selectionCallback);
function selectionCallback(hObject,~)
persistent previouslyChosenItems
%// Elements were added:
if numel(previouslyChosenItems) < numel(hObject.Value)
previouslyChosenItems = union(previouslyChosenItems,hObject.Value,'stable');
%// Elements were removed:
elseif numel(previouslyChosenItems) > numel(hObject.Value)
previouslyChosenItems = intersect(previouslyChosenItems,hObject.Value,'stable');
%// A different element was selected (single element):
elseif numel(previouslyChosenItems) == numel(hObject.Value) && numel(hObject.Value)==1
previouslyChosenItems = hObject.Value;
end
disp(['Currently selected items (in order): ' num2str(previouslyChosenItems(:)')]);
end
end
示例输出:
Currently selected items (in order): 7
Currently selected items (in order): 3
Currently selected items (in order): 3 9
Currently selected items (in order): 3 9 1
然后由您来分配previouslyChosenItems
somplace 有用的值。