【问题标题】:Table cells to be edited only on double click只能在双击时编辑的表格单元格
【发布时间】:2013-11-05 13:08:10
【问题描述】:

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

我正在使用uitable的这个属性:

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

【问题讨论】:

  • 我添加了一个您可以使用的最小示例。只需将其复制到函数脚本中即可。

标签: matlab matlab-uitable


【解决方案1】:

首先您需要将单元格可编辑性设置为默认为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 属性。这是迄今为止唯一的解决方案。

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

【讨论】:

  • 我得到一个错误:==> cellSelect 在 5 state(index) = ~getstate(index);我的表中有 4 列我应该写“state = [false false false false];” ?
  • 是的,你必须根据你的列数来写。
  • 有时它工作正常有时不,只需单击即可编辑单元格:(
  • 你能把你当前的代码贴出来,让我看看吗?最小的例子对你有用吗?
  • 唯一可行的情况是在“选择”之后。但是你实际上会点击另一个单元格。
【解决方案2】:

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

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

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

并定义其功能如下

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

h.jtable 指的是你的 uitable 的底层 java 对象。

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

具有单独可编辑行的扩展

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

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

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 2011-03-18
    • 2014-04-24
    • 2014-12-05
    • 2012-11-13
    • 2020-11-04
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多