2

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

我正在使用以下属性uitable

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

2 回答 2

5

首先,您需要将单元格可编辑性默认设置为 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属性,它也只是一个行向量。如果双击功能对你来说真的很重要,可以参考以下两个答案:

是否可以防止弹出一个合适的弹出菜单?或者:如何通过单击单元格来获取回调,返回行和列索引?

如何取消选择合适的单元格/如何禁用单元格选择突出显示?

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

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

于 2013-11-05T13:48:53.287 回答
2

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

我通过设置仅通过双击实现了编辑

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

并定义其功能如下

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

whereh.jtable指的是您的 uitable 的底层 java 对象。

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

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

我想在第一行有复选框,在表格的其余部分有不可编辑的(至少不是直接的)数据。您可以轻松修改以上内容:

function tableCellSelectCB(~,evd)
    if evd.Indices(1) > 1
        try
            h.jtable.getCellEditor().stopCellEditing();
        catch
        end
    end
end
于 2015-11-11T12:49:46.293 回答