Matlab 如何在uitable中取消选择单元格/如何禁用单元格选择高亮显示?
我创建了以下Matlab 如何在uitable中取消选择单元格/如何禁用单元格选择高亮显示?,matlab,user-interface,callback,matlab-figure,matlab-uitable,Matlab,User Interface,Callback,Matlab Figure,Matlab Uitable,我创建了以下uitable: 实际上,每一行都是一个独立的uitable,因此所示的图中除了标题外还包含5个uitable。为什么我要这样做是我的问题,结果显示了表格。您可以在答案中找到完全可执行的代码(或下面的一个最小示例)。使用通用图形用户界面的解决方案也存在,但这会使代码变得过于复杂,实际上这似乎是一种缺陷 可以看出,每次我跳转到下一行,因此跳转到另一个uitable时,最后一个选择仍然高亮显示,这看起来很愚蠢,尽管这与功能无关 uitables有一个'SelectionHighligh
uitable
:
实际上,每一行都是一个独立的uitable
,因此所示的图中除了标题外还包含5个uitable。为什么我要这样做是我的问题,结果显示了表格。您可以在答案中找到完全可执行的代码(或下面的一个最小示例)。使用通用图形用户界面的解决方案也存在,但这会使代码变得过于复杂,实际上这似乎是一种缺陷
可以看出,每次我跳转到下一行,因此跳转到另一个uitable时,最后一个选择仍然高亮显示,这看起来很愚蠢,尽管这与功能无关
uitables有一个'SelectionHighlight'
属性,听起来像是一个解决方案,但它并没有改变任何事情。我使用它如下:
set(src,'SelectionHighlight','off') %where src is the handle of the current uitable
在不同的位置:在'CellSelectionCallback'
的末尾,在'CellEditCallback'
的末尾,以及作为全局属性。但每次最后一个单元格保持选中状态。其实我根本不需要选择
如何禁用所有uitables的整个选择或选择突出显示属性?
我必须如何使用此属性,才能使其产生效果?
或者:如何更改“突出显示”颜色(以及文本颜色),使突出显示不再可见?
显然,这个问题也出现了
我创建了一个最小可执行示例,其中每行可以选择1到3之间的数字
function minimalTable
%basic properties
line_height = 21.32;
table_height = 3*line_height;
lh = line_height/table_height;
h = figure('Position',[200 100 202 table_height],'numbertitle','off','MenuBar','none');
% addrow(figurehandle,number of row, percentage lineheight)
% every function call creates a new row, later dynamically
addRow(h,1,lh);
addRow(h,2,lh);
addRow(h,3,lh);
end
function modifySelection(src,~)
set(src,'SelectionHighlight','off')
waitfor(src)
end
function [th] = addRow(fh,k,lhp)
selector = { '1'; '2' ; '3' };
defaultData = {'select number...'};
columnformat = { {selector{:}} };
columneditable = true;
th = uitable(fh,'Units','normalized','Position',[0 1-k*lhp 1 lhp],...
'Data', defaultData,...
'ColumnName', [],...
'ColumnWidth', {200},...
'ColumnEditable', columneditable,...
'ColumnFormat', columnformat,...
'RowName',[],...
'SelectionHighlight','off',...
'CellEditCallback',@modifySelection);
end
结果:
经过深入研究,我发现Matlab支持提供了以下解决方案:
%overwrite data with a dummy and restore the old data afterwards, to force deselection
function modifySelection(src,~)
...
temp = get(src,'Data')
set(src,'Data',{ 'dummy' });
set(src,'Data', temp );
end
执行此操作时,蓝色高亮显示消失,但最后选定单元格周围的虚线仍保留强>
但我找到了解决这个问题的办法,这也使得第一部分变得可有可无
function modifySelection(src,evt)
...
fh = get(src,'parent'); % get parent figure handle
copyobj(src,fh); % copy uitable to parent figure
delete(src); % delete current uitable
end
这将导致期望的行为:
第二种解决方案的缺点:由于创建了一个新对象,它有点滞后(可能只是在速度较慢的机器上)。好吧,我找到了一种取消选择单元格的解决方案: 首先,这需要一些Java。但别担心,它看起来仍然像Matlab:) 1.您需要Yair Altman提供的findjobj脚本: 2.您需要表的句柄,我们称之为mtable。然后,您需要底层Java表,并执行一些操作以获取正确的对象并设置一些属性。您可以通过以下方式完成此操作:
jscroll=findjobj(mtable);
h=jscroll.getComponents;
viewport=h(1);
a=viewport.getComponents;
jtable=a(1); %com.mathworks.hg.peer.ui.UITablePeer
jtable.setRowSelectionAllowed(0);
jtable.setColumnSelectionAllowed(0);
3.现在更棘手的部分(至少对我来说是这样):如果您对CellSelectionChanged进行了一些回调,但您现在不想执行此操作,您必须暂时关闭它:
set(mtable, 'CellSelectionCallback', []);
现在,您可以通过以下方式更改选择:
jtable.changeSelection(row-1,col-1, false, false);
%Java-> zero ^= one <-Matlab
4.现在还有一件事:我的目的只是将选择更改为其他单元格。你的是取消选择。我对Java组件一无所知,但我成功地将row/column参数设置为-1:
最后我通过使用和其他帖子中解释的许多内容解决了这个问题。我不确定是否所有的线路都需要打。请注意,这将仅适用于2008年版中首次出现的有文档记录的Matlab uitable(a或b,我对此不确定)
编辑还有许多其他未记录的函数/参数等,您可以使用。为了了解可能的情况,您可以使用autocomplete进行查看。只需在jtable上使用它。选项卡将显示它们。对于这些元素的文档,您可能应该搜索Java文档
只是一个小的“动态”最小示例(等待3秒以查看更改;-):
+我很高兴看到,这是一些解决办法,并感谢张贴它!但我想这可能会给更大的桌子带来一些问题……哪种问题?演出它只影响一个表和一行(在本例中)-所以我想它不会比我6年的机器更糟,它可能会滞后几毫秒。唯一可能有点恼人的是,你完全搞砸了你的句柄定义,因为
copy(…)
不允许给副本一个实际的名称。嗯,也许我弄错了什么,但是你不复制整个表吗?如果是这样的话,我可以想象,如果你有更大的桌子,表演会变慢。也许在这种情况下,设置Visibility开关或“drawnow”会有所帮助。另一个解决方案是使用Java:->使用设置集(jtable、'SelectionBackground',someJavaColor),如注释中所述。也许我会抽出几分钟来尝试一些东西…@luciusdomitiusahenobus出现问题的原因是我没有“一个”uitable-我有(本例中)6个uitable-在每次单元格编辑后,只复制并删除被编辑的特定uitable。所以即使你有大桌子,它们也由很多小桌子组成。当然,也可以在大型“正常”表上应用解决方法,但在这种情况下,通常不会出现问题;)java解决方案可能是最好的。但是我从来没有让它工作过……在将近4年之后,有人问我,有没有更简单的方法来解决这个恼人的行为?所有这些都是为了修复一个相对较小的bug,这基本上不是一个真正的问题:)很高兴看到你不轻易放弃,对你很好。你自己解决了这一切:)永远不要让你的员工感到无聊和无人看管;)我想知道,既然有一个类似于setRowSelectionLowed
的命令,为什么我不能完全禁用选择呢?我突然想到,每次回调都会改变这个属性,对吗?你有没有用最少的例子尝试过这种方法?事实上,在过去的几周里,我无法让任何东西正常工作,包括findjobj
pause(1) set(mtable, 'CellSelectionCallback', @myOriginalFunction);
jtable.changeSelection(-1,-1, false, false);
function startUitable()
xDat=ones(5,3);
h=figure('Tag','TestFigure');
mtable=uitable('Tag','TestUITABLE');
rowField=uicontrol('units','normalized','Style','edit','Position',[0.4 0.9 0.1 0.1],'parent',h,'Tag','rowField');
colField=uicontrol('units','normalized','Style','edit','Position',[0.6 0.9 0.1 0.1],'parent',h,'Tag','colField');
set(mtable, 'Units','normalized','Position',...
[0.01 0.01 0.8 0.8], 'Data', xDat,...
'ColumnEditable', [false, false,false],...
'ColumnWidth', 'auto')
myButton=uicontrol('units','normalized','Style','pushbutton','parent',h,'Position',[0.04 0.9 0.3 0.1],'String','change Selection')
set(myButton,'Callback',@changeSelection)
end
function changeSelection(~,~,~)
mtable=findobj('Tag','TestUITABLE');
jscroll=findjobj(mtable);
h=jscroll.getComponents;
viewport=h(1);
a=viewport.getComponents;
jtable=a(1); %com.mathworks.hg.peer.ui.UITablePeer
% jtable.setRowSelectionAllowed(0);
% jtable.setColumnSelectionAllowed(0);
row=str2num(get(findobj('Tag','rowField'),'String'));
col=str2num(get(findobj('Tag','colField'),'String'));
jtable.changeSelection(row-1,col-1, false, false);
end