Java JTable单元格编辑是否可以使用关键点笔划?

Java JTable单元格编辑是否可以使用关键点笔划?,java,swing,jtable,keystroke,jmenu,Java,Swing,Jtable,Keystroke,Jmenu,在我的程序中,有一个带有许多加速器的JMenu和一个可编辑的JTable。问题是,编辑JTable时,加速器键仍然会被触发 例如,如果我在jtable单元格中输入字母“n”,则“下一步”菜单选项也会触发 如何让jtable单元格编辑器专门使用击键 import javax.swing.JFrame; import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.s

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

例如,如果我在jtable单元格中输入字母“n”,则“下一步”菜单选项也会触发

如何让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”发出嘟嘟声。

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

一种变通方法(注意:所有黑客都是肮脏的,可能会产生不可预见/不可原谅的副作用!)是覆盖表的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;
}