【发布时间】:2015-12-20 20:55:26
【问题描述】:
我正在以编程方式制作 GUI,但遇到了一个关于 uicontrol 列表框和每个“值”或“字符串”所指数据的小问题。我觉得这个问题最好用一些代码来说明。这个问题末尾的代码说明了我的问题。
如果您运行此示例,从左侧列表框中选择所有 5 个文件并按“Button1”,您将看到它们进入右侧列表框。然后,您可以在右侧列表框中选择 1 个或多个文件,然后按“Button2”,MATLAB 将输出正确的文件名。这里一切都很好。
如果关闭并重新运行程序,只选择file1、file3和file5,按Button1会使它们再次进入右侧列表框。这就是我的问题所在:如果您现在选择右侧列表框中的所有文件(file1、file3、file3),然后按 Button2,matlab 输出 file1、file2 和 file3... 而不是 file1、file3 和 file5我愿意。
现在我明白为什么会发生这种情况了,因为在列表框中,它的 value 属性从 1 开始并增加,而单元格 DataSet 中的基础数据保持从 file1 到 file5 的顺序...所以 value 1 2 3 指的是DataSet{1}DataSet{2}DataSet{3}...
解决这个问题的最佳方法是什么?我想补充一点,对于我的实际 GUI,文件名可能并不总是那么明显。
classdef example < handle
properties
Figure;
Button1;
Button2;
ListBox1;
ListBox2;
DataSet = {};
end
methods
function obj = example()
create(obj);
makeUpData(obj);
end
function create(obj)
obj.Figure = figure('Position',[300 300 640 640]);
obj.Button1 = uicontrol('Style','pushbutton','String','Button1',...
'Position',[240 260 80 40],'Callback',@obj.button1CB);
obj.Button2 = uicontrol('Style','pushbutton','String','Button2',...
'Position',[510 260 80 40],'Callback',@obj.button2CB);
obj.ListBox1 = uicontrol('Style','listbox','String','',...
'Position',[50 250 145 100],'Max',3);
obj.ListBox2 = uicontrol('Style','listbox','String','',...
'Position',[350 250 145 100],'Max',3);
end
function makeUpData(obj)
obj.DataSet = {'file1' 'file2' 'file3' 'file4' 'file5'};
obj.ListBox1.String = obj.DataSet;
end
function button1CB(obj,hObject,eventdata)
CurrentNum = get(obj.ListBox1,'Value');
NameListBox1 = get(obj.ListBox1,'String');
NewName = obj.ListBox2.String;
for i = 1:numel(CurrentNum)
NewName{end+1} = [NameListBox1{CurrentNum(i)}];
end
obj.ListBox2.String = NewName;
end
function button2CB(obj,hObject,eventdata)
CurrentNum = get(obj.ListBox2,'Value')
for i = 1:numel(CurrentNum)
obj.DataSet{CurrentNum(i)}
end
end
end
end
【问题讨论】:
标签: matlab user-interface listbox