按键上的JTable编辑

我试图以编程方式开始在按键上的JTable编辑当前行的第三列。

我已经实现了一个KeyListener,它在keyReleased()包含了这段代码

 if (e.getKeyCode() == KeyEvent.VK_ENTER) { myTab.changeSelection(myTab.getSelectedRow(), 2, true, false); myTab.editCellAt(myTab.getSelectedRow(), 2); } 

当我释放回车时,单元格确实可以编辑(我可以在最后键入),但没有插入符号。

当我用鼠标点击时,行为是预期的(我可以编辑和carret存在)。

另外,我注意到在keyrelease上,我的celleditor是null,并且在mouseclick上它不是null。

我究竟做错了什么?

避免使用KeyListener ,它在焦点和调度事件的顺序方面是不可靠的(在侦听器之前可以使它们被消耗掉,因此永远不会得到通知)。

请改用键绑定

 InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); ActionMap am = table.getActionMap(); KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); im.put(enterKey, "Action.enter"); am.put("Action.enter", new AbstractAction() { public void actionPerformed(ActionEvent evt) { table.changeSelection(table.getSelectedRow(), 2, false, false); if (!table.editCellAt(table.getSelectedRow(), 2)) { JOptionPane.showMessageDialog(table, "Failed to start cell editing"); } } }); 

我也怀疑这个myTab.changeSelection(myTab.getSelectedRow(), 2, true, false); 呼叫。 JavaDocs基本上说……

toggle:true,extend:false。 如果选择了指定的单元格,请取消选择它。 如果未选中,请选择它。

这对我来说,如果当前选择了单元格,它将被取消选择。

更新了工作示例

 public class TestTableEditor { public static void main(String[] args) { new TestTableEditor(); } private JTable table; public TestTableEditor() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } table = new JTable(new MyTableModel()); InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); ActionMap am = table.getActionMap(); KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); im.put(enterKey, "Action.enter"); am.put("Action.enter", new AbstractAction() { public void actionPerformed(ActionEvent evt) { table.changeSelection(table.getSelectedRow(), 1, false, false); if (!table.editCellAt(table.getSelectedRow(), 1)) { JOptionPane.showMessageDialog(table, "Failed to start cell editing"); } } }); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new JScrollPane(table)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class MyTableModel extends AbstractTableModel { @Override public int getRowCount() { return 1; } @Override public int getColumnCount() { return 3; } @Override public Object getValueAt(int rowIndex, int columnIndex) { Object value = null; switch (columnIndex) { case 0: value = "Can't edit"; break; case 1: value = "Edit me"; break; case 2: value = "Can't edit"; break; } return value; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex == 1; } } } 

更新

在所有愚蠢,痛苦,难以找到…

添加table.setSurrendersFocusOnKeystroke(true); 你的代码……

设置当由于JTable转发单元的键盘事件而激活编辑器时,此JTable中的编辑器是否获得键盘焦点。 默认情况下,此属性为false,并且除非单击单元格,否则JTable将保留焦点。