在我的程序中,有一个带有许多加速器的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'发出蜂鸣声。
答案 0 :(得分:2)
这是一个错误(我认为很久以前就已经修复过了... tsssee),这是由于JTable的一个相当奇怪的密钥处理。它在按下的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;
}