1

我正在使用 MATLAB 2014auitable'CellEditCallback',我通过单击我的 uitable 中的一个单元格来创建一个新图形。问题是用户可能同时选择多个单元格,然后我的程序将打开与所选单元格一样多的数字。

所以我想知道是否可以禁用合适的单元格多选。如果没有,您有什么建议可以解决我的问题吗?

4

2 回答 2

1

我知道这已经 3 岁了,但我找到了一个简单的解决方案,它对我有用,不会干扰回调 - 更重要的是不需要回调来“取消选择”。我想有人会从中受益。

我正在使用 MATLAB2017a,但要利用的功能位于底层 JAVA 对象中,因此应该适用于旧版本(直到 2008 年)。

您只需访问底层 Java 表对象并将选择模式更改为 SINGLE_SELECTION。为此,我们都需要感谢 Yair 在访问底层 Java 表对象方面所做的工作,更重要的是在 MATLAB 文件交换中共享它(搜索“findjobj”——注意中间的字母“J”!)。

uitable此方法适用于您通过函数或通过在guide编辑器上实现它来实例化 MATLAB uitable 的情况。findjobj您只需将句柄传递给 matlab 表对象(注意:它与底层 java 表对象之间存在区别!)从 MATLAB 文件交换到上述函数并在 JAVA 中配置表。

所以我们要调整的底层JAVA特性是这样的

http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/JList.html#setSelectionMode(int)

这是我在 64 位 Windows 机器上使用 MATLAB 2017a 验证的示例代码:

% create a figure instance
h_fig = figure();

% Instantiate MATLAB's uitable
h_m_table = uitable( h_fig, ...
                    'Data', magic(3), ...
                    'ColumnName', {'A','B','C'} );

% if you already created a table using MATLAB's GUIDE editor, simply pass
% in the "tag" name property, which should be in the "handles" structure by
% default. If you didn't edit that field it's "uitable1" by default so:
% 
% h_m_table = handles.uitable1  % replace 'uitable1' with tag name

% Get java scroll pane object
j_scrollpane = findjobj(h_m_table);

% Get java table object
j_table = j_scrollpane.getViewport.getView;

% (optional) Make entire ROW highlighted when user clicks on any row(s)
j_table.setNonContiguousCellSelection(false);
j_table.setColumnSelectionAllowed(false);
j_table.setRowSelectionAllowed(true);

% Set selction mode to SINGLE_SELECCTION
j_table.setSelectionMode(0);

现在您得到一个带有表格的图形,您一次只能通过单击选择一行。

于 2017-07-17T15:56:20.993 回答
0

我找到了这个线程,并且 findjobj 在 App Designer 上不起作用,所以我需要做更多的搜索。我从来没有找到一种方法可以在 App Designer 中直接取消选择 uitable 上的单元格 - 但我找到了一种无需单元格选择即可用新表格覆盖当前表格的方法。我的代码

于 2019-02-26T14:02:13.363 回答