为什么在KeyListener中需要keyPressed(),KeyRelesed和keyTyped()? -Java [英] Why do I need keyPressed(), KeyRelesed and keyTyped() in a KeyListener? - Java

查看:453
本文介绍了为什么在KeyListener中需要keyPressed(),KeyRelesed和keyTyped()? -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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆