为什么在KeyListener中需要keyPressed(),KeyRelesed和keyTyped()? -Java [英] Why do I need keyPressed(), KeyRelesed and keyTyped() in a KeyListener? - Java
问题描述
我有一个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)
有没有解决的办法,还是我真的必须添加这些未使用的方法?
提前谢谢!
KeyListener
是界面.如果要实现接口,则需要实现其所有方法(因为接口并未为其所有方法提供主体).如果查看Java API文档中的KeyListener
接口,您会发现它有3种方法需要实现:
void keyPressed(KeyEvent e)
void keyReleased(KeyEvent e)
void keyTyped(KeyEvent e)
避免实现所有方法的一种解决方案是使用KeyAdapter
类(来自java.awt.event
包).如Java文档所述:
此类中的方法为空.此类的存在是为了方便创建侦听器对象.扩展此类以创建KeyEvent侦听器,并覆盖感兴趣事件的方法. (如果实现KeyListener接口,则必须定义其中的所有方法.此抽象类为所有接口都定义了空方法,因此只需要为您关心的事件定义方法.) >
因此,您可以将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));
}
}
});
I have a JFrame
and I want to add a KeyListener
to it, because I want to close it by typing alt + F11 (I know, you can just click the cross in the upper right corner, but there is a reason why I need a shortcut).
So I added a 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) {
}
});
As you can see, I only need the keyPressed()
method. But if I remove keyReleased()
and keyTyped()
, I get this error:
The type new KeyListener(){} must implement the inherited abstract method KeyListener.keyReleased(KeyEvent)
Is there a way around it, or do I really have to add these unused methods?
Thanks in advance!
KeyListener
is an interface. If you want to implement an interface, you need to implement all of its methods (as interface doesn't provide a body to all of its methods). If you take a look at KeyListener
interface in Java API documentation, you can see that it has 3 methods that need to be implemented:
void keyPressed(KeyEvent e)
void keyReleased(KeyEvent e)
void keyTyped(KeyEvent e)
One of the solutions for you to avoid implementing all of the methods is to use a KeyAdapter
class (from java.awt.event
package). As Java documentation states:
The methods in this class are empty. This class exists as convenience for creating listener objects. Extend this class to create a KeyEvent listener and override the methods for the events of interest. (If you implement the KeyListener interface, you have to define all of the methods in it. This abstract class defines null methods for them all, so you can only have to define methods for events you care about.)
So, you could modify your addKeyListener
method to something like this:
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.VK_F11 && event.isAltDown()) {
dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
}
}
});
这篇关于为什么在KeyListener中需要keyPressed(),KeyRelesed和keyTyped()? -Java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!