【问题标题】:How to avoid that pressing the ALT key takes away the focus from my GUI如何避免按 ALT 键将焦点从我的 GUI 中移开
【发布时间】:2009-05-15 13:02:55
【问题描述】:

我正在 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);
}
}

【问题讨论】:

  • 您能使用() ALT 键的 KeyEvents 吗?我想这样做的问题是它会破坏 Windows 中 ALT 键的正常功能。
  • 不,我想保留 Windows 的功能 - 访问菜单栏。所以实际上问题不是如何避免焦点切换,而是如何重新获得焦点。
  • 有点解决了:斯科特,你是对的。就我而言,consume() 实际上确实有效。我可以使用 ALT 和鼠标滚轮来实现我的功能,但仍然可以使用例如访问菜单。 ALT+F
  • @räph 你为什么不添加一个实际的答案来说明你是如何解决问题的,为了他人的利益,它可能会在 cmets 中丢失......

标签: java swing


【解决方案1】:

在我的情况下,以下工作:KeyEvent.consume()

使用此事件,以便它不会由发起它的源以默认方式处理。

这会阻止 Windows 窃取我的焦点,但我仍然可以通过 ALT 键盘助记符访问我的菜单项。

感谢 Scott W 的评论!!

【讨论】:

    【解决方案2】:

    我不认为这是可能的,至少不是摇摆不定。我曾经使用过的每一个摇摆应用程序都有同样的问题。这是我放弃使用 Netbeans IDE 的主要原因之一,尽管 IDE 通常非常好。 SWT 应用程序没有这个问题。

    【讨论】:

    • 我已经害怕得到那个答案了 ;( 但是没有一些解决方法可以再次获得关键焦点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2013-05-25
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多