TimeIsNear
TimeIsNear

Reputation: 755

Table cells to be edited only on double click

The table cell is edit with a simple click, I want it to be edit only on double click. Simple click will select the cell.

I'm use this property of uitable:

set(hTable, 'Data',data,...
    'ColumnEditable', edit,...

Upvotes: 2

Views: 2205

Answers (2)

Martin Lehmann
Martin Lehmann

Reputation: 21

Although this thread is old but in my opinion still valuable to some users. I have tested the following with R2010b 32bit.

I have achieved editing only on double click simply by setting

set(hTable,'CellSelectionCallback',@tableCellSelectCB,'ColumnEditable',true)

and defining its function the following

function tableCellSelectCB(~,~)
    try
            h.jtable.getCellEditor().stopCellEditing();
    catch
    end
end

where h.jtable refers to the underlying java object of your uitable.

This way, I can select even single and multiple cells, without going into edit mode. On a double click on a single cells lets me edit its contents.

Extension to have individual editable rows

I wanted to have checkboxes in the top row and non-editable (not directly at least) data in the rest of the table. You can easily modify the above:

function tableCellSelectCB(~,evd)
    if evd.Indices(1) > 1
        try
            h.jtable.getCellEditor().stopCellEditing();
        catch
        end
    end
end

Upvotes: 2

Robert Seifert
Robert Seifert

Reputation: 25232

First you need to set the cell editabiliy to false by default:

set(hTable,'ColumnEditable', [false false ...]);   %accordingly your number of columns

and introduce a CellSelectionCallback:

set(hTable,'CellSelectionCallback',@cellSelect);

which calls the following function within the same script

function cellSelect(src,evt)
getstate = get(src,'ColumnEditable');  %gets status of editability
index = evt.Indices;                   %index of clicked cell
state = [false false ...];             %set all cells to default: not editable
state(index) = ~getstate(index);       %except the clicked one, was it 
                                       %already false before set it true
set(src,'ColumnEditable', state)       %pass property to table
end

and also a CellEditCallback:

set(hTable,'CellEditCallback',@cellEdit);

calling

function cellEdit(src,~)
state = [false false ...];
set(src,'ColumnEditable', state)
end

minimal example

function minimalTable 

h = figure('Position',[600 400 402 100],'numbertitle','off','MenuBar','none');
defaultData  =  {'insert number...' , 'insert number...'};
uitable(h,'Units','normalized','Position',[0 0 1 1],...
              'Data', defaultData,... 
              'ColumnName', [],'RowName',[],...
              'ColumnWidth', {200 200},...
              'ColumnEditable', [false false],...
              'ColumnFormat', {'numeric' , 'numeric'},...  
              'CellSelectionCallback',@cellSelect);

end

function cellSelect(src,evt)
getstate = get(src,'ColumnEditable');
index = evt.Indices;
state = [false false];
state(index) = ~getstate(index);
set(src,'ColumnEditable', state)
end

function cellEdit(src,~)
state = [false false];
set(src,'ColumnEditable', state)
end

As you figured out this is not always working. Because you have the same issues like I had before with popup menus. It's exactly the same problem: ColumnEditable is just a row vector and not a matrix. I had to deal with the ColumnFormat property, which is also just a row vector. If the double click feature is really important to you, you can consult the following two answers:

Is it possible to prevent an uitable popup menu from popping up? Or: How to get a callback by clicking a cell, returning the row & column index?

How to deselect cells in uitable / how to disable cell selection highlighting?

The threads basically suggest to create a unique uitable for every single row, so that every single row has a unique ColumnEditable property. That's the only solution so far.

I'm afraid there is no simple solution. I can't offer you further help, except the complicated workarounds of the other answers. Or just use the simple one above and live with the little drawbacks.

Upvotes: 5

Related Questions