我有一个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)
有没有办法绕过它,还是我真的需要添加这些未使用的方法?
提前致谢!
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));
}
}
});
您需要关键侦听器的所有关键事件,因为只需要程序在Java中正确编译。如果您不需要它们,请将这些方法留空。
因为这是keyListener
的功能。它需要包含所有这些功能。你可以用这个;
public void keyPressed(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.VK_F11 && event.isAltDown()) {
dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
}
}