虽然我将框架注册到keyListener,但keyListener不会触发操作。 在另一个代码中,实现KeyListener接口,注册JFrame并覆盖适当的方法是keyListener工作所需的全部内容。
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Mains implements KeyListener {
private static Point point = new Point();
public Mains() {
final JFrame frame = new JFrame();
frame.setUndecorated(true);
JButton button = new JButton("Close Me");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
frame.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
point.x = e.getX();
point.y = e.getY();
}
});
frame.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
Point p = frame.getLocation();
frame.setLocation(p.x + e.getX() - point.x, p.y + e.getY()
- point.y);
}
});
frame.setSize(300, 300);
frame.setLocation(200, 200);
frame.setLayout(new BorderLayout());
frame.getContentPane().add(button, BorderLayout.NORTH);
frame.getContentPane().add(new JLabel("Drag Me", JLabel.CENTER),
BorderLayout.CENTER);
frame.setVisible(true);
frame.addKeyListener(this);
}
public static void main(String[] args) {
new Mains();
}
public void keyPressed(KeyEvent e) {
System.out.println("pressed");
}
public void keyReleased(KeyEvent e) {
System.out.println("released");
}
public void keyTyped(KeyEvent e) {
}
}
答案 0 :(得分:4)
默认情况下,JFrame
窗口组件不可聚焦。虽然您可以致电JFrame.setFocusable(true)
,但使用Key Bindings要好得多。
KeyListener
需要关注与KeyEvents
互动的组件才能发挥作用。相反,使用键绑定时,即使组件没有焦点,也可以将Action映射到KeyStroke。
答案 1 :(得分:4)
如果附加的组件可以获得焦点并具有焦点,则KeyListerner
仅能够接收键事件。
JFrame
的问题在于它包含JRootPane
,其中包含占据整个框架表面的内容窗格,这将阻止框架获得焦点,这绝不是能够接收关键事件。
KeyListener
很少是正确的API选择,通常,使用key bindings
您可能还会找到感兴趣的How to use root panes