JTable单元格编辑可以消耗击键吗?

在我的程序中,有一个带有许多加速器的JMenu和一个可编辑的JTable。 问题是,在编辑JTable时,加速键仍会被触发。

例如,如果我在jtable单元格中输入字母’n’,那么’next’菜单选项也会激活。

如何让jtable单元格编辑器专门使用击键?

import javax.swing.JFrame; import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JTable; import javax.swing.KeyStroke; import java.awt.event.KeyEvent; import java.awt.Toolkit; public class SampleClass{ public SampleClass(){ JFrame frame = new JFrame(); JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu(); JMenuItem item = new JMenuItem(); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 0)); item.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { Toolkit.getDefaultToolkit().beep(); } }); JTable table = new JTable(new Object[][]{{"Hello","World"},{"Goodbye","World"}}, new String[]{"A","B"}); menu.add(item); menuBar.add(menu); frame.setJMenuBar(menuBar); frame.add(table); frame.pack(); frame.show(); } public static void main(String[] args){ new SampleClass(); } } 

编辑上表中的任何单元格,有一个菜单项设置为使用加速器’n’发出蜂鸣声。

由于JTable的一个相当奇怪的密钥处理,这是一个错误(我认为已经很久以前修复过了… tsssee)。 它在按下的keyEvent上的processKeyBinding中开始编辑 – 如果autoStartEdits为true,则默认为 – 然后将该键传递给editingComponent。 因此,在一天结束时,如果editingComponent使用密钥,则会使用密钥。 TextComponents使用键入的键,而不是按下…这允许按下的键向上移动调度链直到它到达菜单。

一个hackaround(注意:所有黑客都很脏,可能有无法预料/不可预见的副作用!)是覆盖表的processKeyBinding并在开始编辑时使用密钥:

 @Override protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) { boolean result = super.processKeyBinding(ks, e, condition, pressed); if (isEditing() && pressed) return true; return result; }