只需双击即可编辑表格单元格

时间:2013-11-05 13:08:10

标签: matlab matlab-uitable

只需单击即可编辑表格单元格,我希望仅在双击时进行编辑。单击即可选择单元格。

我使用uitable的这个属性:

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

2 个答案:

答案 0 :(得分:5)

首先,您需要在默认情况下将单元格editabiliy设置为false:

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

并介绍CellSelectionCallback

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

在同一个脚本中调用以下函数

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

还有CellEditCallback

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

调用

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

最小示例

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

正如你所知,这并不总是有效。因为你有类似我之前使用弹出菜单的问题。这是完全相同的问题:ColumnEditable只是行向量而不是矩阵。我不得不处理ColumnFormat属性,它也只是一个行向量。如果双击功能对您非常重要,您可以参考以下两个答案:

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?

线程基本上建议为每一行创建一个唯一的uitable,以便每一行都有一个唯一的ColumnEditable属性。到目前为止,这是唯一的解决方案。

我担心没有简单的解决方案。除了其他答案的复杂解决方法之外,我无法为您提供进一步的帮助。或者只是使用上面简单的一个,并忍受一些小缺点。

答案 1 :(得分:2)

虽然这个帖子已经老了,但我认为对某些用户来说仍然很有价值。 我用R2010b 32bit测试了以下内容。

我只需双击即可完成编辑,只需设置

即可
FILE_FLAG_NO_BUFFERING

并定义其功能如下

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

其中function tableCellSelectCB(~,~) try h.jtable.getCellEditor().stopCellEditing(); catch end end 指的是你的uitable的基础java对象。

这样,我甚至可以选择单个和多个单元格,而无需进入编辑模式。双击单个单元格,我可以编辑其内容。

扩展以拥有单独的可编辑行

我希望在表格的其余部分中有顶部的复选框和不可编辑的(非直接至少)数据。您可以轻松修改上述内容:

h.jtable