繁体   English   中英

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

[英]Making a JTable cell editable - but *not* by double clicking

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

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

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

我已经尝试将MouseListener添加到表中,并使用所有MouseEvent ,但这不起作用 - 如果我从isCellEditable()返回true ,那么我的侦听器永远不会收到任何点击事件但如果我返回falseF2不再有效。

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

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

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

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

你必须自己制作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 );

我通过使用Proxy包装现有的CellEditor并拦截对isCellEditable调用,为所有鼠标事件返回false并将所有其他调用委托给原始CellEditor来解决这个问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM