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
的命令,为什么我不能完全禁用选择呢?我突然想到,每次回调都会改变这个属性,对吗?你有没有用最少的例子尝试过这种方法?事实上,在过去的几周里,我无法让任何东西正常工作,包括
findjobjpause(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