为什么KeyListener仅在按下按钮时才起作用?

时间:2018-06-02 05:45:40

标签: java swing awt jbutton keylistener

当我按下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) {
    }

} 

1 个答案:

答案 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。键绑定提供了指定调用它的条件的方法,其中一些不需要组件具有焦点。