我正在制作没有框架的应用程序。就像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);
}
}
答案 0 :(得分:1)
好的,首先{焦点1}是焦点上下文,这意味着它只会在注册的组件可聚焦且具有焦点时触发事件。
在组件层次结构中添加任何可聚焦组件将立即影响侦听器。
可能的问题是,KeyListener
电流具有键盘焦点,因此帧永远不会接收键盘事件(直到它本身可以获得键盘焦点)。
你真的不应该对JButton
使用KeyListener
,JFrame
由JFrame
组成,其中包含JRootPane
(除其他外),在您的上下文中,现在包含一个contentPane
JPanel
,这可能会妨碍...
相反,你应该使用Key Bindings API,它可以让你更好地控制组件所需的焦点水平,以便触发关键事件。
然而,你真的应该对你的JButton
使用这个......因为它往往更具有语境性。
同样mypanel
将确定窗口是否能够接收焦点(包括所有子组件),最好不要单独使用