我试图禁用Windows查找ALT键的默认行为和感受时,JTextArea是重点和框架安装了JMenu的。 什么默认情况是,菜单获取键盘焦点,因此,你无法继续打字那里。
我的第一次尝试通过将关键的JTextArea的InputMap可以捕获单ALT印刷机:
//Disable ALT key presses when the textarea is focused
jta.getInputMap(javax.swing.JComponent.WHEN_FOCUSED).put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ALT, 0, true), "ALTKEY");
jta.getActionMap().put("ALTKEY", new javax.swing.AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("Performed");
}
});
我注意到了这个预期一样在一些第三方的虚拟机而不是在从Oracle 1.8.0_211最新
然后我试图使用从AWT组件按键侦听和它到达其他组件之前消耗该事件。
//Disable ALT key presses when the textarea is focused, second attempt
jta.addKeyListener(new java.awt.event.KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == java.awt.event.KeyEvent.VK_ALT){
System.out.println("Pressed");
e.consume();
}
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == java.awt.event.KeyEvent.VK_ALT){
System.out.println("Released");
e.consume();
}
}
@Override
public void keyTyped(KeyEvent e) {
if(e.getKeyCode() == java.awt.event.KeyEvent.VK_ALT){
System.out.println("Typed");
e.consume();
}
}
});
没运气。
最后,我试图改变用于创建菜单快捷方式,并完全摆脱恼人ALT行为的关键:
//Disable the ALT for the Mnemonic and put CTRL:
int[] ints = {java.awt.event.KeyEvent.CTRL_MASK};
javax.swing.UIManager.put("Menu.shortcutKeys", ints);
这避免了使用与ALT键(CTRL非常完美)的快捷方式,但并没有阻止标准的行为,当一个ALT按完成。
更改L&F到其他平台,或不将其设置为Windows的一个可以解决问题,但当然,它改变了整个程序的外观。
我想我做错了什么,但改变的InputMap或添加KeyListeners工作了第三方虚拟机,所以我开始认为这可能是一个错误。
如何找到谁是听Alt键按下,避免它的任何想法? 有没有一种方法来定制L&F或看到什么是它的配置?
下面是测试的完整代码:
public class JMenubarAltTest extends javax.swing.JFrame{
private static final long serialVersionUID = 1L;
public JMenubarAltTest(){
super();
//Disable the ALT for the Mnemonic and put CTRL key instead:
int[] ints = {java.awt.event.KeyEvent.CTRL_MASK};
javax.swing.UIManager.put("Menu.shortcutKeys", ints);
//Put the platform L&F, in my case I need this to work in Windows
try {
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException e1) {
e1.printStackTrace();
}
this.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
//Create a random menu with some random items
javax.swing.JMenuBar jmb = new javax.swing.JMenuBar();
javax.swing.JMenu jm1 = new javax.swing.JMenu("menu1");
jm1.setMnemonic(java.awt.event.KeyEvent.VK_M);
jm1.add(new javax.swing.JMenuItem("item1"));
jm1.add(new javax.swing.JMenuItem("item2"));
jm1.add(new javax.swing.JMenuItem("item3"));
javax.swing.JMenu jm2 = new javax.swing.JMenu("menu1");
jm2.setMnemonic(java.awt.event.KeyEvent.VK_E);
jm2.add(new javax.swing.JMenuItem("item1"));
jm2.add(new javax.swing.JMenuItem("item2"));
jm2.add(new javax.swing.JMenuItem("item3"));
jmb.add(jm1);
jmb.add(jm2);
this.setJMenuBar(jmb);
//Get a JTextArea to show what happens with the focus
javax.swing.JTextArea jta = new javax.swing.JTextArea();
//Disable ALT key presses when the textarea is focused
jta.getInputMap(javax.swing.JComponent.WHEN_FOCUSED).put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ALT, 0, true), "ALTKEY");
jta.getActionMap().put("ALTKEY", new javax.swing.AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("Performed");
}
});
//Disable ALT key presses when the textarea is focused, second attempt
jta.addKeyListener(new java.awt.event.KeyListener(){
@Override
public void keyPressed(java.awt.event.KeyEvent e) {
if(e.getKeyCode() == java.awt.event.KeyEvent.VK_ALT){
System.out.println("Pressed");
e.consume();
}
}
@Override
public void keyReleased(java.awt.event.KeyEvent e) {
if(e.getKeyCode() == java.awt.event.KeyEvent.VK_ALT){
System.out.println("Released");
e.consume();
}
}
@Override
public void keyTyped(java.awt.event.KeyEvent e) {
if(e.getKeyCode() == java.awt.event.KeyEvent.VK_ALT){
System.out.println("Typed");
e.consume();
}
}
});
this.getContentPane().add(jta);
this.pack();
this.setSize(200, 200);
this.setVisible(true);
}
public static void main(java.lang.String[] args){
new JMenubarAltTest();
}
}