使JTable单元格可编辑 - 但*不*通过双击

时间:2009-08-12 19:24:40

标签: java swing jtable tablecelleditor

我正在尝试使用以下行为向JTable添加列(类似于Windows资源管理器和类似的shell):

  • 可以像往常一样点击单元格以选择它。
  • 可以双击单元格以执行单独的操作(启动外部程序。)
  • 单元格值(字符串)仍然可以通过单击第二次(暂停后)或单击突出显示单元格时按 F2 进行编辑。

双击必须触发单元格的编辑,但如果可能,我希望保留其他任何默认编辑触发器。

我尝试在表中添加MouseListener并使用所有MouseEvent,但这不起作用 - 如果我从true返回isCellEditable(),那么我的听众从未收到任何点击事件,但如果我返回false,则 F2 将不再有效。

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

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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 );

答案 2 :(得分:1)

我通过将现有CellEditorProxy打包并拦截对isCellEditable的调用,对所有鼠标事件返回false并将所有其他调用委托给原始{{1}来解决了这个问题。 }}

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