我正在尝试使用以下行为向JTable
添加列(类似于Windows资源管理器和类似的shell):
双击必须不触发单元格的编辑,但如果可能,我希望保留其他任何默认编辑触发器。
我尝试在表中添加MouseListener
并使用所有MouseEvent
,但这不起作用 - 如果我从true
返回isCellEditable()
,那么我的听众从未收到任何点击事件,但如果我返回false
,则 F2 将不再有效。
这可以仅使用事件监听器来实现吗?如果我可以避免,我宁愿不搞乱PLAF功能。
答案 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)
我通过将现有CellEditor
与Proxy
打包并拦截对isCellEditable
的调用,对所有鼠标事件返回false并将所有其他调用委托给原始{{1}来解决了这个问题。 }}
这比camickr的解决方案稍微复杂一点,但适用于所有编辑器(我总共有4个。)