【问题标题】:AddKeyListener via Lambda functionAddKeyListener 通过 Lambda 函数
【发布时间】:2020-04-24 08:35:32
【问题描述】:

我尝试使用 lambda 函数将 KeyListener KeyTyped 添加到我的 JTextField 中,就像我对动作侦听器所做的那样:

cmp_btn.addActionListener(e -> actionPerformed(e));
private void actionPerformed(ActionEvent e)
{
  // Do something ...
}

如果我使用 addKeyListener(e -> keyPerformed(e)); 尝试它,我会收到错误“提供 lambda 参数”,但返回的是“必需类型:KeyEvent”。

函数如上图,但参数KeyEvent e

// 编辑 1: 我刚刚看到,addKeyListener 需要一个 KeyAdapter。由于 KeyAdapter 是一个抽象类,我需要实例化一个 KeyAdapter 以使其工作,但如果我这样做了,那么我再次拥有内联函数(我不想要它,因为重用了该函数)。有没有办法从内联块中提取定义的函数?

// 编辑 2: 该问题的可能(丑陋)解决方案是:

cmp_textfield.addKeyListener(new KeyAdapter() {
  @Override
  public void keyTyped(KeyEvent e)
  {
    super.keyTyped(e);
    My_KeyTyped_Method(e);
  }
});

有没有更好的办法?

【问题讨论】:

    标签: java swing lambda keylistener


    【解决方案1】:

    实际上,addKeyListenerKeyListener 作为参数。另一方面,KeyAdapter 是出于您创建此问题的原因而创建的。为了“简单”。看看KeyAdapter

    public abstract class KeyAdapter implements KeyListener {
        public void keyTyped(KeyEvent e) {}
    
        public void keyPressed(KeyEvent e) {}
        public void keyReleased(KeyEvent e) {}
    }
    

    它实现了KeyListener 并让您覆盖 - 定位您关心的方法。用 lambdas 添加 KeyListener 是不可能的,因为 lambdas 只能用于 @FunctionalInterfaces。 @FunctionalInterface 是只有一个非default 方法的接口。 KeyListener 接口不是一个,因为它有 3 个方法。

    您对此无能为力。一种方法是通过扩展KeyListener 接口来创建@FunctinalInterfaces,并使与您“无关”的方法default

    一个例子:

    @FunctionalInterface //Not required, just a convention
    public interface KeyRealeasedListener extends KeyListener {
    
        @Override
        default void keyPressed(KeyEvent e) {
        }
    
        @Override
        default void keyTyped(KeyEvent e) {
        }
    }
    

    请注意,keyReleased 未实现。并将其添加到组件中:

    component.addKeyListener((KeyRealeasedListener) e -> System.out.println("key released"));
    

    【讨论】:

    • 您好,乔治,谢谢!我使用您的解决方案来解决问题。这很有趣,因为我通常在 C# 中工作。所以为了让自己明白:您的解决方案包括 KeyListener 类的默认 keyPressed 和 keyTyped 方法,对吧?虽然没有定义 keyReleased,但 addKeyListener 构造假定调用 keyReleased,对吗?如果我只使用keyPressed的默认方法并在界面中删除keyTyped方法,那么没有办法使用你提到的想法。我说的对吗?
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2020-04-18
    • 2017-06-20
    相关资源
    最近更新 更多