通过Lambda函数AddKeyListener

问题描述 投票:0回答:1

我尝试添加一个KeyListener KeyTyped 到我的JTextField,就像我对动作监听器所做的那样,用一个lambda函数。

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

如果我用 addKeyListener(e -> keyPerformed(e)); 我得到的错误是 "提供了lambda参数",但返回的是 "required type: KeyEvent "的错误。

这个函数就像上面显示的那样,但是有 KeyEvent e 作为参数。

/ EDIT 1.我刚刚看到,addKeyListener需要一个KeyAdapter。我刚刚看到,addKeyListener需要一个KeyAdapter。由于KeyAdapter是一个抽象类,我需要实例化一个KeyAdapter来使它工作,但是如果我这样做,我又有了内联函数(我不希望这样,因为会重复使用函数)。有没有办法从内联块中提取定义的函数?

/ EDIT 2:这个问题的一个可能的(丑陋的)解决方案是:

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

有没有更好的方法?

java swing lambda keylistener
1个回答
3
投票

其实。addKeyListener 需要 KeyListener 作为参数。KeyAdapter 从另一方面为你创建这个问题的原因。为了 "简单"。请看一下 KeyAdapter:

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

    public void keyPressed(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}
}

它执行 KeyListener 并让你覆盖--针对你关心的方法。添加一个 KeyListener 不可能用lambdas,因为lambdas可以用于 @FunctionalInterfaces只。A @FunctionalInterface 是只有一个非default 方法。KeyListener 接口不是一个,因为它有3个方法。

你不能对它做什么。一种方法是创建 @FunctinalInterface延长 KeyListener 接口,并使 "与你无关的 "方法成为 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"));
© www.soinside.com 2019 - 2024. All rights reserved.