制作一个JTable细胞可编辑的 - 但*不通过双击

问题描述:

我试图将列添加到一个JTable有以下行为(类似于Windows资源管理器和类似贝壳)*:制作一个JTable细胞可编辑的 - 但*不通过双击

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

双击要细胞触发的编辑,但我想离开,如果可能的任何其他默认编辑触发操作。

我曾尝试加入MouseListener表,并消耗所有MouseEvent S,但这并不工作 - 如果我从isCellEditable()回到true那么我的听众从来没有收到任何点击事件,但如果我回到false然后F2没有更长的作品。

这可以通过只使用事件侦听器来实现吗?如果我能避免它,我宁愿不要惹恼PLAF功能。

+0

[这里](http://stackoverflow.com/a/25919008/738017)存在由[camickr](更近的答案http://stackoverflow.com/users/131872/camickr),其解决了4行代码的问题。 – 2015-02-22 21:49:27

你将不得不作出自己的cellEditor的和ovveride

public boolean isCellEditable(EventObject e) 

您可以单人和双人的点击之间,就在eventObject

使用clickCount区分。如果它是一个单一的点击和对选定的cell可以返回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()); 

,并从你的行动,你可以随后击发cellediting自己

table.editCellAt(row, column); 
+0

这与我对代理所做的相似。我只重写isCellEditable。关键笔画处理程序包含在默认编辑器中。我不需要重新实现它。 – finnw 2009-08-13 08:08:45

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

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

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

+0

无需定时器 - 它只是需要为双击注册太慢。 – finnw 2009-08-12 20:57:54

我已经用Proxy包装现有CellEditor和拦截来电isCellEditable,返回所有的鼠标事件虚假和委托其他所有调用原CellEditor解决了这个。

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

+0

我很想看到解决方案。此外,我不明白你如何区分单元格的初始点击和点击以启动编辑。您的代码是否只跟踪最后选中的单元格,以及何时在开始编辑的同一单元格上获得两次单击?如果是这样,那么第二次点击可能是第二次或几分钟后。你最初的要求是在“暂停”之后说的,这就是为什么我建议一个定时器来控制暂停间隔的原因。 – camickr 2009-08-13 02:49:27

+0

@carnickr,我还没有实现这部分尚未但是没错,听起来权利。没有时间限制。 – finnw 2009-08-13 08:37:30