提问者:小点点

添加自定义方法作为组件的键监听器


我正在尝试使用不同的方法来定义单独的方法作为我的摇摆框架中每个组件的侦听器。

对于动作侦听器,它就像使用此签名定义私有空格一样简单:

private void myButtonActionListener(ActionEvent e)

并使用方法引用运算符将其分配给按钮:

myButton.addActionListener(this::myButtonActionListener);

但是,它似乎不适用于关键侦听器。我这样定义方法:

private void myTextBoxKeyPressed(KeyEvent event)

但是这行代码会引发一个错误,说“它不是一个功能界面”:

myTextBox.addKeyListener(this::myTextBoxKeyPressed);

与操作侦听器不同,键侦听器有多个方法要实现,因此如何解决此问题的任何想法。

我很了解其他方法,例如实现侦听器的类或使用匿名内部类,但我更喜欢找到一种新的方法来保持我的代码更干净。

提前感谢


共2个答案

匿名用户

您应该使用AbstractAction,以及JComponent. setAction或J组件.getActionMap()

public MyAction extends AbstractAction {
  public void actionPerformed(ActionEvent ae) {
  //...
  }
}

匿名用户

我认为这是不可能的。Java足够聪明,能够用适当的声明来对待函数myButtonActionListener,就好像你实现了一个实现所需接口ActionListener的匿名类一样。这就是myButtonActionListener可以像你描述的那样使用的唯一原因,因为ActionListener只需要你实现一个函数,而不需要其他任何东西。

然而,KeyListener需要三个(!)函数来实现。Java无法理解您试图“实现”这三个函数中的哪一个,因为它们的声明是相同的,即使实现了,那么您仍然没有实现另外两个,这在设计上是非法的,因为您无法判断使用您的KeyListener的函数是否使用它们。你无法绕过它。如果需要接口的实现,那么这就是您需要提供的。

为了让它更干净一点,您可以创建一个内联对象来实现您想要的接口。这是一个使用Runnable Interface的示例:

Runnable r = new Runnable() {    
    @Override
    public void run() {
        // do something
    }
};