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

问题描述 投票:2回答:3

我有一个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(),我会收到此错误: 新的KeyListener(){}类型必须实现继承的抽象方法KeyListener.keyReleased(KeyEvent)

有没有办法绕过它,还是我真的需要添加这些未使用的方法?

提前致谢!

java keylistener
3个回答
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));
        }
    }      
});

0
投票

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


0
投票

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

public void keyPressed(KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.VK_F11 && event.isAltDown()) {
        dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.