matlab - 如何取消选择uitable中的单元格/如何禁用单元格选择突出显示?

标签 matlab user-interface callback matlab-figure matlab-uitable

我创建了以下 uitable:

bug

实际上每一行都是一个独立的uitable,所以图中显示的除了标题之外还包含5个uitables。为什么我这样做是我的 last question 的问题, 产生了所示的表格。您可以在答案 here 中找到完全可执行的代码(或下面的最小示例)。使用通用 GUI 的解决方案也有,但它会把代码炸得太多,实际上它似乎只是一种错误。

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

uitables 有一个 'SelectionHighlight' 属性,听起来像是一个解决方案,但它并没有改变任何东西。我按如下方式使用它:

set(src,'SelectionHighlight','off')  %where src is the handle of the current uitable

在不同的地方:在 'CellSelectionCallback' 的末尾,在 'CellEditCallback' 的末尾以及作为全局属性。但每次最后一个单元格仍然被选中。其实我根本不需要选择。

如何为我的所有 uitables 禁用整个选择或选择突出显示属性?

我要如何使用这个属性,让它有效果?

或者:如何更改“突出显示”颜色(以及文本颜色)以便突出显示不再可见?

显然这个问题也出现了in other contexts .


我创建了一个最小可执行示例,其中可以在每一行中选择 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

结果:

min_example

最佳答案

经过更深入的研究,我发现 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

这会导致所需的行为:

enter image description here

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

关于matlab - 如何取消选择uitable中的单元格/如何禁用单元格选择突出显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634250/

相关文章:

matlab - 获取圆边界

java - Jframe setDefaultCloseOperation 不起作用

matlab - 如何在 MATLAB 中将单个值/矩阵分配给多个变量?

matlab - 如何从 MATLAB 中的符号表达式创建函数?

java - 我如何将我的 Retrofit 数据从 MainActivity 发送到我的 Fragment?

c++ - 高级 iOS GUI(最好使用 C++)

node.js - 我应该如何批量上传到 s3 并通过最终回调从 nodeJS 网络服务器插入到 MongoDB?

ruby-on-rails - 在 after_commit 中更新属性时防止无限循环,:on => :create

multithreading - Nodejs中的单线程是什么意思

matlab - 在垂直于目标点的 3D 线上找到交点