【问题标题】:Why do I need keyPressed(), KeyRelesed and keyTyped() in a KeyListener? - Java为什么我需要在 KeyListener 中使用 keyPressed()、KeyRelesed 和 keyTyped()? - 爪哇
【发布时间】:2018-01-04 18:42:44
【问题描述】:

我有一个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)

有没有办法解决它,还是我真的必须添加这些未使用的方法?

提前致谢!

【问题讨论】:

  • "有没有办法绕过它,还是我真的必须添加这些未使用的方法?" - 这就是接口的工作方式。要么实现接口中定义的所有方法,要么使类抽象。你别无选择(除非接口定义了default 方法,而KeyListener 没有)。您当然可以将未使用的方法留空。
  • 你可以编写一个函数来创建并返回一个KeyListener,它接受一个lambda并从KeyPressed调用它。虽然如果你不打算经常使用它,最好还是坚持界面希望你使用它的方式,反正它更灵活。
  • 好的!谢谢!我应该忽略它...

标签: java keylistener


【解决方案1】:

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方法,所以你只需要为你关心的事件定义方法。) p>

因此,您可以将您的 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));
        }
    }      
});

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      因为这就是keyListener 函数。它需要包括所有这些功能。你可以用这个;

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

      【讨论】:

      猜你喜欢
      • 2011-10-27
      • 2011-08-20
      • 2015-07-12
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多