でほかのActionListenerするでしょうか。を追加できま引数のactionPerformed?

StackOverflow https://stackoverflow.com/questions/2515552

  •  22-09-2019
  •  | 
  •  

質問

私は大きなテーブルを含むボタンです。これらのボタンは非常に似ているほとんど同じです。場合を追加するアクションリスナーの各ボタンこのように:

tmp.addActionListener(new ActionListener(){
   @Override
   public void actionPerformed(ActionEvent evt) {
      proposition = proposition + action;
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            updatePropositionPanel();
         }
      });
   }
});

実際に、アクションリスナーからすべてのその他の値によって action. propositionupdatePropositionPanel ている分野や手法のクラスです。

  1. 最初に思いつくることができますが短くない場合、その利用内部クラス.私もこういったプログラムの新しいActionListenerです。がより実感したこの場合"提案"は見えない、このクラスのインスタンス.

  2. そのためにまずは追加のactionPerformedメソッドは、現在のクラスとなること: addActionListener(this).がより思い方がわからない引数のactionPerformedメソッドをトリガします.

では、どのような仕組みになっている.を追加できまアクションリスナーそしてelegentす。

追加:

気に入ったようにプログラムの内部クラスコンストラクタでできるか引数とactioPerformed方法をとることができるも与えられた引数をコンストラクタです。開始していますので、それを作成し、紛争その他の匿名の内部クラスのように使用して上記されている総コンテンツ).ないかと思い作成しますクラス(内)してご利用いただけます。

役に立ちましたか?

解決

あなたは、独自のクラスを作成し、コンストラクタにデータを渡すことができます。たとえば、

public class MyActionListener
{
    private int proposition;
    private MyOtherClass moc;

    public MyActionListener(int proposition, MyOtherClass moc) {
        this.proposition = proposition;
        this.moc = moc;
    }

    public void actionPerformed(ActionEvent evt) {
        proposition += moc.action;
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                moc.updatePropositionPanel();
            }
        });
    }
}

次に、あなたがコンストラクタに好きな引数通常、合格とそれを追加することができます

tmp.addActionListener( new MyActionListener(proposition, this) );

他のヒント

編集:。私はMyOuterClassで建設を表示するために、クラスを変更した。

ここではいくつかのコードでは、スケッチです。うまくいけば、これは私がそれを実装する方法をしている、あなたの1になっています。

public class MyOuterClass {
    // member variables for MyOuterClass

    public MyOuterClass() {
        // ...constructor stuff here
    }
    // ...outer class stuff here - methods, etc.

    // The code each place you want to add the listener, somewhere in MyOuterClass
    tmp.addActionListener(new MyActionListener(poposition, action));


    // below outer class stuff, although it can really be most places, I usually put
    // it here - personal style preference.  Swing's classes often put inner
    // classes first

    /**
     * An inner class.
     */
    private MyActionListener implements ActionListener {
        /**
      * Object used here as a filler, replace with appropriate
      * class types
      */
        private Object proposition;
        private Object action;

        private MyActionListener(Object proposition, Object action) {
            this.proposition = proposition;
            this.action = action;
        }
        public void actionPerformed(ActionEvent evt) {
          proposition = proposition + action;
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                updatePropositionPanel();
             }
        }
        /**
         * Setters provided in case you need to change proposition and action.  If not,
         * feel free not to have them and to have final members
         */
        private void setProposition(Object proposition) {
            this.proposition = proposition;
        }
        private void setAction(Object action) {
            this.action = action;
        }
    }
}

編集:あなたの編集中を求めて別のクラスを作成するには、上記のようにしてください。しかし、離れて、別の.javaファイルとコード内の非プライベート他のクラスを作成します。

あなたはメソッド内のコードを配置することができますactionの値が異なるだけであるため、

。 (また@Overrideが不要であり、+=はここで有用である。)

public void setup(
    final AbstractButton button,
    final int action
) { 
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            proposition += action;
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                   updatePropositionPanel();
                }
           });
        }
    });
}

あなたはとにかくAWTイベントディスパッチスレッド(EDT)になりますようinvokeLaterはおそらく無意味です。

あなたは汎用アクションの多くを追加する場合は、

、その後、あなたはそれに関連付けられている無意味イベントオブジェクトを持っていないインタフェースを使用して、それを簡素化することができます。

あなたがハックになりたいと思った場合は、

あなたは、サブクラスのコンストラクタでリスナーを追加することができます。

    new ActionHandler(button) { public void action() {
        proposition += action;
        updatePropositionPanel();
    }});

うまくいけば、JDK7はそれほど冗長なもののこの種のためのJava構文を行います。 Javaは、しかし、常にやや冗長になります。

オプション1つの作品あなたがproposition可変を行う場合(例えばStringBuilder代わりStringの)。オプション2つの作品あなたがそれらfinalを宣言した場合。この方法で、彼らしているアクセス/インナークラスでは見えています。

あなたは別のMyActionListenerクラスを作成し、コンストラクタで二つの値の命題とアクションを渡すことができます。これは、ソースコードをdecluttersます。

あなたはあなた自身のリスナクラスその実装のActionListenerを作成することができます。このクラスは、あなたが話しているパラメータに対応するメンバ変数を含めることができます。あなたは、コンストラクタを使用して設定したいです。

リスナーを追加するための呼び出しは、このようになります:

tmp.addActionListener(new MyActionListenerSubClass(proposition, action));

私はあなたの命題と行動変数は、この例のための文字列であることを仮定します。 インターフェイスPropositionUpdater、インターフェースPropositionPanelUpdater、および協力者の命題ホルダを定義する

public interface PropositionUpdater() {
    public void updateProposition(PropositionHolder holder, String action);
}

public interface PropositionHolder() {
    public String getProposition();

    public void setProposition(String proposition);
}

public interface PropositionPanelUpdater() {
    public void updatePropositionPanel();
}

は命題アップデータのデフォルトの実装は、単にこれです

public class DefaultPropositionUpdater implements PropositionUpdater {
    public void updateProposition(final PropositionHolder holder, final String action) {
        holder.setProposition(holder.getProposition() + action);
    }
}

私はあなたの想像力にPropositionHolderとPropositionPanelUpdaterのデフォルトを残しておきます;)

さて、ここであなたのアクションリスナーがあります:

public class PropositionUpdaterActionListener implements ActionListener {
    private PropositionHolder holder;

    private PropositionUpdater updater;

    private PropositionPanelUpdater panelUpdater;

    public PropositionUpdaterActionListener(final PropositionHolder holder, final PropositionUpdater updater, final PropositionPanelUpdater panelUpdater) {
        super();
        this.holder = holder;
        this.updater = updater;
        this.panelUpdater = panelUpdater;
    }

    public void actionPerformed(final ActionEvent evt) {
        //Not sure how you *got* the action, but whatever...
        updater.updateProposition(holder, action);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                panelUpdater.updatePropositionPanel();
            }
        });
    }
}

あなたが話しているどのように多くのボタン言いませんでした。

それはチェス盤のような少数だ以下の場合は、

は、@ jusktのアプローチは良いものです。

あなたは大きな何かを見ている場合は、私はこのアプローチを使用することになります:

public class MyActionListener {
      public void actionPerformed(ActionEvent evt) {
          JComponent c = (JComponent)evt.getSoource();
          int prop = (Integer)c.getclientProperty("PROPOSITION");
          int act = (Integer)c.getclientProperty("ACTION");
          SomeClass obj = c.getclientProperty("UPDATE");
          prop += act;
          // If necessary, clientPut("PROPOSITION", prop);
          SwingUtilities.invokeLater(new    Runnable() {
              public void run() {
                  obj.updatePropositionPanel();
              }
          });
      }
}

このアクションリスナーには状態を保持していません。 その結果、単一のインスタンスは、ボタンのすべてのために使用することができます。 碁盤(19路盤)のようなものについては、これは1つのオブジェクトの代わりに、361ということになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top