为什么我需要在KeyListener中使用keyPressed(),KeyRelesed和keyTyped()? - Java

时间:2018-01-04 18:42:45

标签: java keylistener

我有一个JFrame,我想在其中添加KeyListener,因为我想通过输入 alt + F11 关闭它(我知道,你可以单击右上角的十字架,但我需要一个快捷方式。

所以我添加了KeyListener

addKeyListener(new KeyListener() {

    @Override
    public void keyPressed(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.VK_F11 && event.isAltDown()) {
            dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {                   
    }

    @Override
    public void keyTyped(KeyEvent e) {                  
    }
});

如您所见,我只需要keyPressed()方法。但是,如果我删除keyReleased()keyTyped(),我会收到此错误:
类型new KeyListener(){}必须实现继承的抽象方法KeyListener.keyReleased(KeyEvent)

有没有解决方法,或者我真的需要添加这些未使用的方法吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

KeyListener是一个界面。如果要实现接口,则需要实现其所有方法(因为接口不为其所有方法提供主体)。如果您查看Java API文档中的KeyListener接口,您会发现它有3个需要实现的方法:

void    keyPressed​(KeyEvent e)
void    keyReleased​(KeyEvent e)
void    keyTyped​(KeyEvent e)

避免实现所有方法的解决方案之一是使用KeyAdapter类(来自java.awt.event包)。正如Java文档所述:

此类中的方法为空。此类存在是为了创建侦听器对象的便利。扩展此类以创建KeyEvent侦听器并覆盖感兴趣事件的方法。 (如果实现KeyListener接口,则必须定义其中的所有方法。此抽象类为它们定义了所有的null方法,因此您只需要为您关心的事件定义方法。)

因此,您可以将addKeyListener方法修改为以下内容:

addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.VK_F11 && event.isAltDown()) {
            dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
        }
    }      
});

答案 1 :(得分:0)

您需要关键侦听器的所有关键事件,因为只需要程序在Java中正确编译即可。如果您不需要它们,请将这些方法留空。

答案 2 :(得分:0)

因为这是keyListener功能。它需要包含所有这些功能。你可以使用它;

public void keyPressed(KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.VK_F11 && event.isAltDown()) {
        dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
    }
}