我创建了以下uitable
:
实际上每一行都是独立的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
结果:
答案 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
这导致了所需的行为:
第二个解决方案的缺点:由于创建了一个新对象,它有点滞后(可能只是在慢速机器上)。
答案 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