我尝试添加一个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);
}
});
有没有更好的方法?
其实。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可以用于 @FunctionalInterface
s只。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"));