如何取消选择适合的单元格/如何禁用单元格选择突出显示?

the*_*alk 6 matlab user-interface callback matlab-figure matlab-uitable

我创建了以下内容uitable:

窃听器

实际上每一行都是独立的uitable,所以显示的数字除了标题之外还包含5个uitable.为什么我这样做是我上一个问题的问题,导致显示的表格.您可以在此处的答案中找到完全可执行的代码(或下面的最小示例).使用通用GUI的解决方案也存在,但它会过多地破坏代码,实际上它似乎只是一种bug.

可以看出,每当我跳到下一行,因此到另一行时,最后的选择仍然突出显示,这看起来很愚蠢,尽管它对功能无关紧要.

有一个属于'SelectionHighlight'uitables 的属性,听起来像一个解决方案,但它没有改变任何东西.我用它如下:

set(src,'SelectionHighlight','off')  %where src is the handle of the current uitable
Run Code Online (Sandbox Code Playgroud)

在各个地方:在一个结束时'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
Run Code Online (Sandbox Code Playgroud)

结果是:

min_example

the*_*alk 4

经过更深入的研究,我发现 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
Run Code Online (Sandbox Code Playgroud)

执行此操作,蓝色突出显示消失,但最后选定的单元格周围的虚线仍然存在! 但我找到了解决这个问题的解决方案,这也使得第一部分变得可有可无。

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
Run Code Online (Sandbox Code Playgroud)

这会产生所需的行为:

在此输入图像描述

第二种解决方案的缺点:由于创建了新对象,它有点滞后(可能只是在慢速机器上)。