当我按下ESC键时,我想让KeyListener停止程序。但它只有在我什么都不做的时候才能工作(按下按钮)。我很抱歉,如果它是非常明显的东西,但我找不到错误。
package basics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Graphic extends JFrame implements ActionListener, KeyListener {
private JButton button;
public Graphic() {
button = new JButton();
button.addActionListener(this);
button.setIcon(new ImageIcon("Image.jpg"));
this.getContentPane().add(button);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button){
//some code
}
}
public static void main(String[] args) {
JFrame bec = new Graphic();
bec.setDefaultCloseOperation(Graphic.EXIT_ON_CLOSE);
bec.setSize(1731, 563);
bec.setVisible(true);
bec.setTitle("title");
bec.requestFocus();
bec.addKeyListener(new Graphic());
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
System.exit(0);
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
答案 0 :(得分:0)
但它只有在我什么也没做的时候才会起作用(按下按钮)。
不,它不起作用( at all )。看看这段代码:
public static void main(String[] args) {
JFrame bec = new Graphic();
// ..
bec.addKeyListener(new Graphic());
}
密钥监听器被添加到永远不会显示的Graphic
的第二个实例。
它不起作用的另一个原因:因为KeyListener
(即使添加到正确的实例中)要求它添加的组件都是可聚焦的(默认情况下为JFrame
不是)并且具有输入焦点(该帧永远不会有,因为它不可聚焦)。
解决方案:对于Swing,我们通常使用key bindings而不是较低级KeyListener
。键绑定提供了指定调用它的条件的方法,其中一些不需要组件具有焦点。