java - 如何避免按下 ALT 键使我的 GUI 失去焦点

标签 java swing

我正在 Windows 中使用 swing 开发一个 java 应用。

问题是:按下(并释放)ALT 键后,下一次按键无效(不会触发 keyPressed 事件)。只有释放下一个键才会被识别。在 ALT 之后按下并释放 CTRLSHIFT 根本没有任何效果。您首先必须按下另一个键或单击组件以再次接收来自 CTRLSHIFT 的按键事件。

可能 Windows 将焦点从我的 GUI 组件转移到框架的标题/菜单。 我需要 ALT+MouseWheel 在我的应用程序中移动图形,如果我之后想使用 CTRL+MouseWheel 缩放图形,这将不起作用。 那么如何阻止 ALT 带走焦点(但仍然能够使用例如 ALT+F 访问菜单项)?

我已经尝试过 Component.requestFocus() - 但实际上我的组件并没有真正失去焦点。

一个显示行为的简单示例:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextField;

class MyKeyListener implements KeyListener {
public void keyTyped(KeyEvent arg0) {}

public void keyPressed(KeyEvent arg0) {
    System.out.println("Key perssed: " + arg0.getKeyCode());
}   
public void keyReleased(KeyEvent arg0) {
    System.out.println("Key released: " + arg0.getKeyCode());
}
}

public class KeyListenerDemo {

public static void main(String[] a) {
    JFrame frame = new JFrame("Keytest");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setFocusTraversalKeysEnabled(true);
    JTextField textField = new JTextField();
    textField.addKeyListener(new MyKeyListener());
    frame.add(textField);
    frame.setSize(300, 200);
    frame.setVisible(true);
}
}

最佳答案

在我的例子中,以下方法有效:KeyEvent.consume()

Consumes this event so that it will not be processed in the default manner by the source which originated it.

这会阻止 Windows 窃取我的注意力,但我仍然能够通过键盘助记符和 ALT 访问我的菜单项。

感谢 Scott W 的评论!!

关于java - 如何避免按下 ALT 键使我的 GUI 失去焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/868553/

相关文章:

java - Tomcat 8.5.33 Java WebApp 突然变慢了

java - 来自 jsr310 的 LocalDateTimeDeserializer 是否正确反序列化祖鲁日期?

java - 从给定的 3D 数组中查找 null 的数组索引

java - 将多个 JPanel 添加到 JFrame

java - WSO2 Eclipse Luna 数据映射器加载错误

java - 动画 View 移出我的布局

java - 在 actionPerformed 中运行 "this"方法 - JButton?

java - 键绑定(bind)不适用于某些键,例如插入、删除

java - 从 JMenuItem 调用时,模态内部框架使用 100% CPU

Java:Pacman 与墙壁的碰撞检测