【问题标题】:Window is not firing keytyped event窗口未触发 keytyped 事件
【发布时间】:2014-08-09 05:05:42
【问题描述】:

我正在制作一个没有框架的应用程序。就像 Windows 中的小工具一样。
但我无法从此窗口获取关键事件。 这是我的代码:

JWindow win = new JWindow("gadget");
win.setFocusable(true); 
win.setFocusableWindowState(true);
win.add(mypanel);                     // mypanel is a JPanel that I have created.
win.setSize(300, 100);
win.setLocation(400, 200);
win.addMouseListener(mymouselistener) // mymouselistener is a MouseAdapter
win.addKeyListener(mykeylistener)     // mykeylistener is a KeyAdapter
win.setVisible(true);

我正在通过 mymouselistener 获取鼠标事件,它工作正常。 但是 mykeylistener 不起作用。

这里是监听器的简单代码:

MouseAdapter mymouselistener = new MouseAdapter() {
     @Override
     public void mouseClicked(MouseEvent e) {
         win.setFocusableWindowState(true);
         System.out.println(e);
     }
 }


KeyAdapter mykeylistener = {
     @Override
     public void mouseClicked(MouseEvent e) {
         win.setFocusableWindowState(true);
         System.out.println(e);
     }
 }

【问题讨论】:

  • 对于 Swing,我们通常在较低级别上使用 key bindings,基于 AWT,KeyListener。
  • 我们能看到监听代码吗?
  • 我已经添加了监听代码。 @BitNinja
  • setWindowFocusableState 做你认为它做的事
  • myPanel 包含什么?

标签: java swing keylistener


【解决方案1】:

好的,首先KeyListener 是焦点上下文,这意味着它只会在它注册到的组件具有焦点且具有焦点时触发事件。

在组件层次结构中添加任何可聚焦组件都会立即影响侦听器。

可能的问题是,JButton 当前具有键盘焦点,因此框架将永远不会接收键盘事件(直到它本身可以获得键盘焦点)。

您真的不应该使用 KeyListener 来对抗 JFrame,JFrame 由 JRootPane 组成,其中包含 contentPane(以及其他内容),在您的上下文中,现在包含一个JPanel 和一个JButton,有很多东西会妨碍...

相反,您应该使用Key Bindings API,它可以让您更好地控制组件触发关键事件所需的焦点级别。

但是,您确实应该将其用于您的 mypanel...因为它往往更具上下文。

另外setFocusableWindowState 将确定窗口是否能够接收焦点(包括所有子组件),最好不要管它

【讨论】:

  • 我认为 JButton 没有焦点,因为如果我按空格键 Enter 它应该可以工作,但事实并非如此。
  • 有太多的事情可能会阻止它工作......如果容器层次结构中的任何一个组件是可聚焦的,它们可能会阻止框架恢复关键事件。如果框架本身不可聚焦(从键盘焦点管理器的角度来看),它将不会接收事件。有很多事情会导致这个问题,你最好不要使用它。
  • 我已经编辑了代码,看看它。您能帮我了解如何使我的窗口具有焦点。窗口中没有元素获得焦点。我知道这一点是因为焦点仍在该窗口之外,因为即使在单击我的窗口后我键入了一个键,输出也在我最后一个焦点窗口上,即 Netbeans 窗口。
  • 我需要做一些测试,但必须等到喝完茶后我的女儿上床睡觉,因为我的妻子要杀了我,因为她在她(我的女儿)做的时候不看她茶:P
  • 为什么没有人先告诉我。它正在工作。@MadProgrammer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
相关资源
最近更新 更多