1

私は時々このようなコードを見ます:

new myJFrame().setVisible(true);

それがどのように機能するかは正確にはわかりませんがmyJFrame、コンストラクターで表示する代わりに、実際にを作成して表示するように設定します。

私が知りたいのは、次のように、JMenuItemまたはJButtonでこれを実行して、最初に明示的に宣言しなくてもActionListenerを自動的に割り当てる方法があるかどうかです。

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

私が試した限りでは、これは機能しません。

私はそれが機能する必要はありません。それが可能かどうかを知りたいのです。それは私にかなりの時間を節約するからです。

前もって感謝します。

4

4 に答える 4

3

JMenuItem.addActionListener()何も返さないため(これはvoidメソッドです)、提案されたコードは機能しません。したがって、引数として渡すものはありませんJMenu.add()

最初の例では、何も返されませんが、問題ではありません。

@biziclopで述べたように、コーディングの一部のスタイルでは、ほとんどのメソッドが返さthisれるため、それらをチェーン化できます。たとえば、FluentInterfaceを使用するビルダーはこれを行う傾向があります

于 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

厄介なものが必要な場合は、非finalクラスの匿名拡張を実行し、匿名コンストラクターを追加して初期化することができます。

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