5

我正在尝试向JTable具有以下行为的列添加一列(类似于 Windows 资源管理器和类似的外壳):

  • 像往常一样,可以单击一次单元格以将其选中。
  • 可以双击单元格以执行单独的操作(启动外部程序。)
  • 仍然可以编辑单元格值(字符串),方法是再次单击(暂停后)或F2在单元格突出显示时按下。

双击不能触发单元格的编辑,但如果可能的话,我想保留任何其他默认的编辑触发器。

我尝试将 a 添加MouseListener到表中并消耗所有MouseEvents,但这不起作用 - 如果我从那时返回trueisCellEditable()我的侦听器将永远不会收到任何点击事件,但如果我返回falseF2不再工作。

这可以仅使用事件侦听器来实现吗?如果可以避免的话,我宁愿不要弄乱 PLAF 的功能。

4

3 回答 3

4

DefaultCellEditor 有一个 setClickCountToStart() 方法来控制鼠标点击进行编辑。默认值为 2。更改此值不会影响 F2 功能。

因此,您可以将编辑设置为三次单击。

不确定如何处理两次单击以开始编辑,但我想您会使用计时器来跟踪第一次单击,然后在第二次单击在您的时间间隔内时进行编辑。

于 2009-08-12T20:37:11.660 回答
3

您将必须制作自己的 cellEditor 和 ovveride

public boolean isCellEditable( EventObject e )

您可以使用 eventObject 上的 clickCount 来区分单击和双击

如果它是一次单击并且它在选定的单元格上,您可以返回 true,否则返回 false;

检索行和列

int row = ( (JTable) e.getSource() ).rowAtPoint(e.getPoint());
int column = ( (JTable) e.getSource() ).columnAtPoint(e.getPoint());

要启用 F2,您可以添加自定义 inputMap 和 actionMap 条目

similar too
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown");
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction()); 

然后从您的操作中您可以自己触发单元编辑

table.editCellAt(row, column );
于 2009-08-13T07:35:02.797 回答
1

我已经解决了这个问题,方法是用 a 包装现有CellEditorProxy并拦截对 的调用isCellEditable,为所有鼠标事件返回 false 并将所有其他调用委托给原始CellEditor.

这比 camickr 的解决方案稍微复杂一些,但适用于所有编辑器(我总共有 4 个。)

于 2009-08-12T23:29:18.710 回答