1

我有时会看到这样的代码:

new myJFrame().setVisible(true);

我不完全知道它是如何工作的,但它实际上创建了 amyJFrame并将其设置为可见,作为将其设置为在其构造函数上可见的替代方法。

我想知道的是,是否有办法在 JMenuItem 或 JButton 上执行此操作,以自动为其分配 ActionListener 而无需先显式声明它,如:

myJMenu.add(new JMenuItem("Item").addActionListener(myActionListener));

就我所尝试的而言,这是行不通的。

我并不完全需要它来工作,我只是想知道它是否可能,因为它可以为我节省一些时间。

提前致谢。

4

4 回答 4

3

Your proposed code won't work because JMenuItem.addActionListener() does not return anything (it's a void method), so there is nothing to pass as the argument to JMenu.add().

In the first example, there is also nothing returned, but it doesn't matter.

As mentioned by @biziclop, in some styles of coding most methods return this so that they can be chained together. For example, Builders which use a Fluent Interface tend to do this.

于 2012-06-07T20:17:35.203 回答
3

它被称为方法链接,简单地说,一个类要么支持它,要么不支持它,这取决于它是如何编写的。

它的完成方式很简单:

public class Bar {

   private Set<Foo> foos;

   public Bar addFoo( Foo foo ) {
     this.foos.add( foo );
     return this;
   }
}

从这里你也可以看到为什么不能链接不是以这种方式编写的方法。

于 2012-06-07T20:14:08.307 回答
3

作为替代方案,请考虑使用采用 的JMenuItem构造函数Action

myJMenu.add(new JMenuItem(new AbstractAction("Item") {

    @Override
    public void actionPerformed(ActionEvent e) {
        ...
    }
});
于 2012-06-07T22:10:44.667 回答
0

if you want nastiness you can do an anonymous extension of a non-final class and add an anonymous constructor to initialize stuff:

ArrayList ar=new ArrayList()  
    {
      {
        add(new Object());
      }
    };
于 2012-06-07T20:17:23.597 回答