【问题标题】:adding new JButton() with actionListener without declaring it使用 actionListener 添加新的 JButton() 而不声明它
【发布时间】:2016-03-11 07:07:28
【问题描述】:

我想在 JPanel 中添加一个带有 actionListener 的 JButton,而不像下面这样声明 JButton。

JPanel tempPanel = new JPanel();
tempPanel.add(new JButton().addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // DO SOMETHING
        }
   }));

错误消息给我Cannot resolve method 'add(void)'

我不知道为什么这是不正确的。只是语法错误吗?还是我不能像这样用 ActionListener 添加 JButton?

我确定,如果我这样做,它会起作用。

JButton tempButton = new JButton();
tempButton.addActionListener(new ActionListener() {
    @Override
        public void actionPerformed(ActionEvent e) {
            // DO SOMETHING
        }
    });
tempPanel.add(tempButton);

感谢您的帮助。提前致谢。

【问题讨论】:

  • 因为addActionListener 是您在JButton 上调用的方法,并且该方法不会返回JButton,因为它是void。最后void 不是add 方法的有效参数。您通常不能在 Java 中链接这样的方法,因为它们很可能不会返回 this
  • 感谢您回答我的问题。那么,这是否意味着没有不同的方法可以让我的第一个代码工作?除了我作为第二个代码编写的方式?
  • new JButton(new AbstractAction() { ... }) 你需要在 AbstractAction 中实现 actionPerformed 方法,但你会得到基本相同的结果
  • @MadProgrammer 谢谢!您总是能很好地回答问题,包括我的其他几个问题和许多其他问题...我总是看到您回答或评论 Java 问题...再次感谢! :) </offtopic>

标签: java swing jpanel jbutton actionlistener


【解决方案1】:

JButton#addActionListener 返回void,是链中的最后一个调用,这是编译器会尝试发送给JPanel#add 的结果,这显然没有意义。

虽然我不会争论方法链接的优点,但 API 就是这样。

你可以这样做......

JPanel tempPanel = new JPanel();
tempPanel.add(new JButton(new AbstractAction() {
    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
        //...
    }
}));

相反,这会导致与您尝试做的事情相同

【讨论】:

    【解决方案2】:

    Java 给您错误消息,因为tempPanel.add() 采用addActionListener() 的返回值,它是无效的。

    有些库确实提供了链式函数(例如 android 中的 Dialog),您可以编写这样的代码。但是,恐怕在这种情况下,您必须先声明它,然后为 JButton 添加一个侦听器。或者,您可以尝试编写自己的 Button 类来扩展 JButton,并在其构造函数中添加一个参数作为侦听器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2013-10-06
      • 1970-01-01
      相关资源
      最近更新 更多