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

fin*_*nnw 5 java swing jtable tablecelleditor

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

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

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

我曾尝试添加一个MouseListener表,并消耗所有MouseEventS,但这并不工作-如果我回到trueisCellEditable()那么我的听众从来没有收到任何点击事件,但如果我回到false然后F2不再起作用.

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

Pet*_*ter 3

你必须制作自己的 cellEditor 和 ovveride

public boolean isCellEditable( EventObject e )
Run Code Online (Sandbox Code Playgroud)

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

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

检索行和列

int row = ( (JTable) e.getSource() ).rowAtPoint(e.getPoint());
int column = ( (JTable) e.getSource() ).columnAtPoint(e.getPoint());
Run Code Online (Sandbox Code Playgroud)

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

similar too
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown");
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction()); 
Run Code Online (Sandbox Code Playgroud)

然后根据您的操作,您可以自己启动单元格编辑

table.editCellAt(row, column );
Run Code Online (Sandbox Code Playgroud)