Как отменить выбор ячеек в uitable / как отключить выделение выделенных ячеек?

Я создал следующее uitable:

bug

на самом деле каждая строка является indpendent uitable, поэтому показанный рисунок содержит 5 uitables помимо заголовка. Почему я это делаю, был вопрос моего последний вопрос, в результате чего в приведенной таблице. Полностью исполняемый код вы можете найти в ответе здесь (или минимальный пример ниже). Решения с использованием общего GUI также существуют, но это слишком сильно взорвет код, и на самом деле, это просто какая-то ошибка.

видно, что каждый раз, когда я перехожу к следующей строке, поэтому к другому uitable, последний выбор остается выделенным, что выглядит глупо, хотя это не имеет значения для функциональности.

есть 'SelectionHighlight' свойство для uitables, звучит как решение, но оно ничего не меняет. Я использовал его следующим образом:

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

результаты:

min_example

2 ответов


после некоторых более глубоких исследований я узнал, что поддержка 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

недостаток второго решения: он отстает от маленькие (наверное только на медленных машинах), из-за создания нового объекта.


хорошо, я нашел решение для отмены выбора ячеек:

прежде всего, для этого требуется некоторая Java. Но не волнуйтесь, он все равно будет выглядеть как Матлаб :)

1. вам понадобится скрипт 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, но вы не хотите, чтобы excecute это сейчас, вы должны отключить его временно:

set(mtable, 'CellSelectionCallback', []);

теперь вы можете изменить выбор:

jtable.changeSelection(row-1,col-1, false, false);
%Java-> zero ^= one <-Matlab

и теперь, я ожидал, что при установке CellSelectionCallback обратно в исходную функцию все будет штраф. Неа, это был excecuting обратного вызова. Я до сих пор не знаю точной причины, но мне кажется, что вызов jtable.changeSelection () выбор изменяется, а затем вызывает указанный обратный вызов, но вызывающая функция не ждет, пока этот процесс выполняется. Поэтому я попытался (и я не знаю, лучший ли это способ сделать это, но он работает очень хорошо), чтобы просто сделать паузу на секунду, а затем установить Callabck обратно:

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

4. теперь еще один вещь: моя цель состояла в том, чтобы просто изменить выбор на какую-то другую ячейку. Твое-отменить выбор. Я ничего не знаю о компонентах Java, но мне удалось просто установить параметр row/column в -1:

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

наконец-то мне удалось решить эту проблему, используя многие вещи, объясненные на undocumentedmatlab.com и другие сообщения. Я не уверен, что все линии необходимы для вызова. Обратите внимание, что это будет доступно только для документированный Matlab-uitable, который появляется первым в версии 2008 (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