像@Guillaume一样,我运行您的代码没问题。您可能会在这里讨论过
CellEditor无意中失败的情况。一个SSCCE可能有助于澄清问题。
editingStopped()
附录:您可以在
saveAction()处理程序中取消编辑,如下所示。
table.editingCanceled(null);
供参考,我在几个方面更新了您的示例:
Control-S
不受任何JTable
Action
常见的外观实现的约束,因此无需删除它。- 为了方便跨平台使用,请使用
getMenuShortcutKeyMask()
。 - 只能 在事件分配线程上构造和操作Swing GUI对象。
码:
import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.KeyEvent;import javax.swing.AbstractAction;import javax.swing.ActionMap;import javax.swing.InputMap;import javax.swing.JComponent;import javax.swing.Jframe;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.KeyStroke;public class TestTableKeyBinding extends Jframe { private static final int MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); private JTable table; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { TestTableKeyBinding test = new TestTableKeyBinding(); test.setVisible(true); } }); } TestTableKeyBinding() { super(); initUI(); addKeyBindings(); } private void initUI() { this.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); String[] headers = new String[]{"apples", "bananas"}; String[][] data = new String[][]{{"1", "2"}, {"4", "6"}}; table = new JTable(data, headers); table.setCellSelectionEnabled(true); this.add(new JScrollPane(table)); this.pack(); this.setSize(new Dimension(300, 400)); } private void addKeyBindings() { //root maps InputMap im = this.getRootPane().getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); ActionMap am = this.getRootPane().getActionMap(); //add custom action im.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, MASK), "save"); am.put("save", saveAction()); } private AbstractAction saveAction() { AbstractAction save = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog( TestTableKeyBinding.this.table, "Action Triggered."); table.editingCanceled(null); } }; return save; }}


