Programatically selecting cells in a uitable

조회 수: 54 (최근 30일)
Brian
Brian 2017년 7월 16일
답변: Adam Danz 2021년 5월 10일
How would I programatically select a cell, e.g., highlight row 3, column 2 in a uitable?
I found some 5+ year old answers using an obsolete version of uitable that no longer seem to work.
Edit: here is what I found that did not work:
  댓글 수: 2
Jan
Jan 2017년 7월 17일
If you have found some almost useful information, share it with the readers. Otehrwise they might use the search function and must test, if you meant the same thread.
Jan
Jan 2017년 7월 18일
There is a bunch of code in this long thread. Please explain, what you have tried and what "did not work" means. Perhaps you had a typo only?

댓글을 달려면 로그인하십시오.

채택된 답변

Brian
Brian 2017년 7월 18일
편집: Jan 2019년 11월 20일
I figured out the answer by further reviewing the long thread in my question. Here is some updated code that works at least until Matlab R2015b.
% m = numeric handle to uitable
m = uitable(...);
jUIScrollPane = findjobj(m);
jUITable = jUIScrollPane.getViewport.getView;
jUITable.changeSelection(row-1,col-1, false, false);
% subtract 1 from row and col you want selected
% the last two arguments do the following:
% false, false: Clear the previous selection and ensure the
% new cell is selected.
% false, true: Extend the previous selection (select a range of cells).
% true, false: Toggle selection
% true, true: Apply the selection state of the anchor to all cells
% between it and the specified cell.
Using combinations of the last two arguments, you can select any cells you want programatically, even if they're not contiguous.
  댓글 수: 4
Adam Danz
Adam Danz 2019년 12월 6일
Note that this method does not work in app designer UI tables.
Also note that the findjobj() function uses the JavaFrame property and javacomponent function which will no longer be supported by Matlab in future releases.
More info:
Leonardo Pérez
Leonardo Pérez 2020년 8월 26일
Works!

댓글을 달려면 로그인하십시오.

추가 답변 (4개)

Can Yuce
Can Yuce 2018년 8월 24일
편집: Can Yuce 2018년 8월 24일
Other solutions exists but may risk race-conditions with the Event Dispatch Thread (EDT). If you are interested in selecting a single row, one working solution running safely on Java Swing’s Event Dispatch Thread (EDT) without risking a race-condition or deadlock with the EDT would be:
jscrollpane = javaObjectEDT(findjobj(src));
viewport = javaObjectEDT(jscrollpane.getViewport);
jtable = javaObjectEDT( viewport.getView );
jtable.scrollRowToVisible(row_ - 1);
it requires findjobj functionality, and works fine on Matlab R2017a.

Gene Sanchez
Gene Sanchez 2019년 11월 17일
편집: Jan 2019년 11월 20일
I wanted to select multiple cell, but was unable to find an answer on how to do it. The key is on the last two arguments of the function
jUITable.changeSelection(row-1,col-1, false, false);
According to Yair, they are (rowIndex, columnIndex, toggleFlag, extendFlag)
So the following example will select three separate cells:
jUITable.changeSelection(1,1, false, false);
jUITable.changeSelection(1,2, true, false);
jUITable.changeSelection(2,2, true, false);
While this example will select a region with four cells, then another region with five cells:
jUITable.changeSelection(1,1, false, false);
jUITable.changeSelection(1,2, false, true); % extend selection
jUITable.changeSelection(5,1, true, false); % toggle to 2nd selection
jUITable.changeSelection(5,1, true, true); % extend 2nd selection
On a separate note, Finding which cell are selected is not sufficiently done by getSelectedRows
jUITable.getSelectedRows
ans =
3×1 int32 column vector
1
2
5
Returns 3 numbers, instead of the five I need to know all the cells that have been selected. Is there an analogous getSelectedCells??
Right now I have to scan the whole set of getSelectedRows and getSelectedColumns to find the currently selected cells, using jUITable.isCellSelected(i,j).

HAO YUAN
HAO YUAN 2019년 5월 19일
jtableobj=findjobj(tableobj); % tableobj, uitable object
SelMod=jtableobj.getTableSelectionModel;
SelMod.clearSelection;
% rows cols of cells
for irows=1:length(rows)
SelMod.addSelection(rows(irows)-1,cols(irows)-1);
end

Adam Danz
Adam Danz 2021년 5월 10일
Starting in Matlab R2021a, you can programmatically scroll to any row, column, or cell of a uitable using the scroll function (see Four New App Features in MATLAB R2021a).
Syntax examples:

카테고리

Help CenterFile Exchange에서 Environment and Settings에 대해 자세히 알아보기

태그

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by