我有一个字符串的单元数组(实际上是用户选择的文件列表)。然后,我想调出一个用户界面控件,允许用户手动重新排列该列表。在Matlab中手动排列字符串单元数组的用户控制函数
基本上我希望用户能够选择处理给定文件的顺序。是否有一段代码已经这样做,或者有没有人有任何好的建议,如何做到这一点?
理想情况下,它会显示字符串列表(文件名),您可以点击一个并点击向上或向下箭头在列表中向上或向下移动它,或者用于奖励点:P它可以拖动他们重新排序(尽管我怀疑matlab GUI存在这样的事情)。
我有一个字符串的单元数组(实际上是用户选择的文件列表)。然后,我想调出一个用户界面控件,允许用户手动重新排列该列表。在Matlab中手动排列字符串单元数组的用户控制函数
基本上我希望用户能够选择处理给定文件的顺序。是否有一段代码已经这样做,或者有没有人有任何好的建议,如何做到这一点?
理想情况下,它会显示字符串列表(文件名),您可以点击一个并点击向上或向下箭头在列表中向上或向下移动它,或者用于奖励点:P它可以拖动他们重新排序(尽管我怀疑matlab GUI存在这样的事情)。
在Matlab中没有对此的本地支持。最简单的解决方案是使用uitable
和“一些黑客”。
下面显示的解决方案适用于选择表格中的单个单元格或多个单元格。保持界限,即值不“环绕”。
function reorderableTable
h(1) = figure(1); clf
filenames = {...
'file1.txt.'
'file2.txt.'
'file3.txt.'
'file4.txt.'
'file5.txt.'
};
h(2) = uitable(h(1),...
'data' , filenames, ...
'units' , 'normalized',...
'position', [0.1 0.1 0.5 0.85],...
'CellSelectionCallback', @selectCells);
h(3) = uicontrol(...
'style' , 'pushbutton', ...
'units' , 'normalized',...
'position', [0.7 0.58 0.2 0.15],...
'string' , 'Up',...
'callback', @reOrder);
h(4) = uicontrol(...
'style' , 'pushbutton', ...
'units' , 'normalized',...
'position', [0.7 0.38 0.2 0.15],...
'string' , 'Down',...
'callback', @reOrder);
set(h(3:4), 'enable', 'off');
function selectCells(src, evt)
set(src, 'UserData', evt.Indices);
if ~isempty(evt.Indices)
set(h(3:4), 'enable', 'on');
else
set(h(3:4), 'enable', 'off');
end
end
function reOrder(src,~)
up = strcmpi(get(src, 'string'), 'up');
table = h(2);
data = get(table, 'Data');
selected = get(table, 'UserData');
selected = selected(:,1);
if up
sel = selected-1;
not_selected = setdiff(sel, selected);
nsel = setdiff(selected, sel);
if sel(1)>=1 && nsel(end)<=size(data,1)
new_data = data;
new_data(sel ,:) = data(selected,:);
new_data(nsel,:) = data(not_selected,:);
else
return
end
else
sel = selected+1;
not_selected = setdiff(sel, selected);
nsel = setdiff(selected, sel);
if sel(1)<=size(data,1) && nsel(end)>=1
new_data = data;
new_data(sel ,:) = data(selected,:);
new_data(nsel,:) = data(not_selected,:);
else
return
end
end
set(table, 'Data', new_data);
end
end
灵感(部分)来自here。
如果你不喜欢嵌套函数,很容易将它们重新定义为子函数,但是你必须传递句柄(这就是为什么我选择首先使用嵌套函数的原因)。
拖动和坠:它可以被本地完成,但仅仅在uitable
列(见this link)。我认为这看起来很可怕,但如果你只有一个或两个文件,可能会工作。
否则:您可以使用按键如上图所示,或张望了一下谷歌,看看是否有一些其他的Java对象(不是jTable
之外)确实允许你拖约行。我对Java并不熟悉,所以你不得不去其他地方看看。