避免使用
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基本上说…
切换:true,扩展: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保留焦点。



