tablas - llenar tabla gui matlab
¿Cómo anular la selección de celdas en uitable/cómo desactivar el resaltado de selección de celdas? (2)
Después de una investigación más profunda descubrí que el soporte de Matlab sale con la siguiente solución:
%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
Al hacer esto, el resaltado azul se ha ido, ¡PERO la línea punteada alrededor de la última celda seleccionada permanece! Pero encontré una solución para resolver esto, que también hace que la primera parte sea prescindible.
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
Lo que resulta en el comportamiento deseado:
Desventaja de la segunda solución: se retrasa un poco (probablemente solo en máquinas lentas), debido a la creación de un nuevo objeto.
uitable
el siguiente uitable
:
en realidad, cada fila es uitable
, por lo que la figura que se muestra contiene 5 elementos adicionales además del encabezado. Por qué estoy haciendo eso fue el problema de mi última pregunta , que resultó en la tabla que se muestra. Código totalmente ejecutable que puede encontrar en la respuesta aquí (o en un ejemplo mínimo a continuación). Las soluciones que usan una GUI general también están ahí, pero eso haría estallar demasiado el código, y en realidad parece ser una especie de error.
Se puede ver que cada vez que salto a la siguiente fila, por lo tanto a otra uitable, la última selección permanece resaltada, lo que parece estúpido, aunque no importa para la funcionalidad.
Existe la propiedad ''SelectionHighlight''
para los usuarios que pueden acceder, parece una solución, pero no cambia nada. Lo usé de la siguiente manera:
set(src,''SelectionHighlight'',''off'') %where src is the handle of the current uitable
en varios lugares: al final de un ''CellSelectionCallback''
, al final de un ''CellEditCallback''
y como propiedad global. Pero cada vez que la última celda permanece seleccionada. En realidad, no necesito selección en absoluto.
¿Cómo puedo desactivar toda la propiedad de resaltar selección o selección para todas mis aplicaciones?
¿Cómo debo usar esta propiedad, que tiene un efecto?
Alternativamente: ¿cómo puedo cambiar el color de "resaltado" (y por lo tanto el color del texto) para que el resaltado ya no sea visible?
Aparentemente, este problema también aparece en otros contextos .
Creé un ejemplo ejecutable mínimo , donde uno puede seleccionar un número entre 1 y 3 en cada fila.
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
resultados en:
Muy bien, encontré una solución para deseleccionar células:
Antes que nada, esto requiere algo de Java. Pero no te preocupes, todavía se verá como Matlab :)
1. Necesitarás el script findjobj de Yair Altman: TMW File-Exchange: findjobj
2. Necesitas el control de tu mesa, vamos a llamarlo mtable . Luego necesita la tabla Java subyacente y hacer algunas cosas para obtener los objetos correctos y establecer algunas propiedades. Puedes hacer esto por:
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. Ahora la parte más complicada (al menos fue para mí): si tiene alguna Devolución de llamada para CellSelectionChanged, pero no quiere superar esto ahora, debe desactivarlo temporalmente:
set(mtable, ''CellSelectionCallback'', []);
Ahora puede cambiar la selección por:
jtable.changeSelection(row-1,col-1, false, false);
%Java-> zero ^= one <-Matlab
Y ahora, esperaba, al volver a establecer CellSelectionCallback en su función original, todo estaría bien. No, estaba superando la Devolución de llamada. Todavía no sé el motivo exacto, pero me parece que al llamar a jtable.changeSelection () la selección cambia y luego llama a la Devolución de llamada especificada, pero la función de llamada no está esperando mientras se está ejecutando este proceso. Entonces, lo que probé (y no sé si esta es la mejor manera de hacerlo, pero está funcionando muy bien) es hacer una pausa por un segundo y luego configurar el Callabck:
pause(1)
set(mtable, ''CellSelectionCallback'', @myOriginalFunction);
4. Ahora solo una cosa más: mi propósito era simplemente cambiar la selección a alguna otra celda. El tuyo es anular la selección. No sé nada sobre los componentes de Java, pero lo logré simplemente estableciendo el parámetro fila / columna en -1 :
jtable.changeSelection(-1,-1, false, false);
Finalmente logré resolver este problema usando muchas cosas explicadas en undocumentedmatlab.com y otras publicaciones. No estoy seguro si todas las líneas son necesarias para llamar. Tenga en cuenta que esto solo estará disponible para el Matlab-uitable documentado que aparece primero en la Versión 2008 ( aob , no estoy seguro de eso).
EDITAR hay muchas otras funciones / parámetros, etc. que puede usar, que no están documentados. Solo para ver qué es posible, puedes echar un vistazo con la función autocompletar. Solo úsalo en el jtable. y Tab los mostrará. Para una documentación sobre esos elementos probablemente deberías buscar un Java-doc.
Solo un pequeño ejemplo "dinámico" pequeño (espere 3 segundos para ver un cambio ;-)):
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