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

时间:2013-10-28 12:00:14

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

我创建了以下uitable

bug

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

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

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

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

在不同的地方:'CellSelectionCallback'的末尾,'CellEditCallback'的末尾和全球财产。但每次最后一个单元格仍然被选中。其实我根本不需要选择。

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

如何使用此属性,它有效?

另外:如何更改“突出显示”颜色(以及文字颜色),以便突出显示不再可见?

显然,此问题也会出现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

2 个答案:

答案 0 :(得分: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

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

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

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

答案 1 :(得分:1)

好吧,我找到了取消选择细胞的解决方案:

首先,这需要一些Java。但不要担心,它仍然看起来像Matlab:)

1。您需要Yair Altman提供的脚本 findjobj TMW File-Exchange: 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

现在,我在期待,当将CellSelectionCallback设置回原来的功能时,一切都会好的。不,它正在谴责Callback。我仍然不知道确切的原因,但在我看来,调用jtable.changeSelection()选择更改然后调用指定的Callback,但调用程序函数不等待此进程正在运行。所以我尝试了(我不知道这是否是最好的方法,但它工作得很好)只是暂停一秒钟,然后将Callabck设置回来:

pause(1)
set(mtable, 'CellSelectionCallback', @myOriginalFunction);

4。现在还有一件事:我的目的只是将选择更改为其他一些单元格。你的是取消选择。我对Java组件一无所知,但我只是将row / column参数设置为 -1

jtable.changeSelection(-1,-1, false, false);

最后我设法通过使用undocumentedmatlab.com和其他帖子中解释的许多内容来解决此问题。我不确定是否需要拨打所有线路。请注意,这仅适用于2008年版本中首先出现的Matlab-uitable( a b ,我不确定)。

编辑您可以使用许多其他未记录的功能/参数等。只是看看有什么可能,你可以看看自动完成。只需在 jtable上使用它。 Tab 将显示它们。有关这些元素的文档,您应该搜索Java-doc。

只是一个小的“动态”最小例子(等待3秒才能看到变化;-)):

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