使用actionListener添加新的JButton()而不声明它

时间:2016-03-11 07:07:28

标签: java swing jpanel jbutton actionlistener

我想将一个带有actionListener的JButton添加到JPanel,而不像下面那样声明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);

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

2 个答案:

答案 0 :(得分:2)

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) {
        //...
    }
}));
相反,这将导致与您尝试做同样的事情

答案 1 :(得分:1)

Java会向您显示错误消息,因为tempPanel.add()的返回值为addActionListener(),这是无效的。

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