向组件添加自定义方法作为键侦听器

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

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

对于动作监听器,就像用此签名定义一个私有空位一样容易:

private void myButtonActionListener(ActionEvent e)

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

myButton.addActionListener(this::myButtonActionListener);

但是,它似乎对key listeners不起作用。我定义了这样的方法:

private void myTextBoxKeyPressed(KeyEvent event)

但是此行代码会引发错误,指出“ 它不是功能接口”:

myTextBox.addKeyListener(this::myTextBoxKeyPressed);

关于解决此问题的任何想法,与动作侦听器不同,键侦听器有多种实现方法。

我很清楚其他方法,例如实现侦听器的类或使用匿名内部类的方法,但我更愿意寻找一种新方法来保持代码的整洁。

预先感谢

java swing keylistener
2个回答
0
投票

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

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

0
投票

我认为这是不可能的。 Java足够聪明,能够使用适当的声明来处理函数myButtonActionListener,就好像您实现了实现所需接口ActionListener的匿名类一样。那就是myButtonActionListener可以按照您的描述使用的唯一原因,因为ActionListener仅需要您实现一个功能,而无需执行其他任何操作。

但是,KeyListener要求实现三(!)函数。 Java无法理解您要“实现”的这三个函数中的哪一个,因为它们的声明是相同的,即使这样做,也仍然没有实现其他两个在设计上不合法的函数,因为您不能判断使用KeyListener的函数是否使用它们。你不会绕开它。如果需要接口的实现,那么那就是您需要提供的。

为了使它更简洁一点,您可以创建一个内联对象,以实现所需的接口。这是使用Runnable接口的示例:

Runnable r = new Runnable() {    
    @Override
    public void run() {
        // do something
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.