窗口没有触发keytyped事件

时间:2014-08-09 05:05:43

标签: java swing keylistener

我正在制作没有框架的应用程序。就像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);
     }
 }

1 个答案:

答案 0 :(得分:1)

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

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

可能的问题是,KeyListener电流具有键盘焦点,因此帧永远不会接收键盘事件(直到它本身可以获得键盘焦点)。

你真的不应该对JButton使用KeyListenerJFrameJFrame组成,其中包含JRootPane(除其他外),在您的上下文中,现在包含一个contentPane JPanel,这可能会妨碍...

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

然而,你真的应该对你的JButton使用这个......因为它往往更具有语境性。

同样mypanel将确定窗口是否能够接收焦点(包括所有子组件),最好不要单独使用