2010-12-17 12 views
1

私は、テキストフィールドにティッカーシンボルを入力すると、株価チャートのプロットを呼び出すアプリケーションを開発しています。また、メニュー項目を選択することによって、このチャートを特定の方法で変更したいと考えています。Javaの「ネストされた」ActionListeners?

ソフトウェアで言えば、ActionListenersメニュー項目にステータスパラメータの値を変更させてから、TextField ActionListenerを呼び出してチャートを再配置するだけです。

これを達成する他の方法はもちろんありますが、別のactionlistener内からアクションリスナーを呼び出す方法はありますか。コンパイラはそのアイデアが気に入らない。

ありがとうございました。

ジョンDoner

+0

コードサンプルを投稿できますか? –

+1

私には信じられないほど悪い考えがあります。 –

+0

もしそれが悪い考えだと言うなら、少なくともそれが正しく動作するようにするためのテキストを追加してください。 –

答えて

1

サブスクライバとパブリッシャの両方として機能するクラスを作成しようとしています。クラスにActionListenerインタフェースを実装させるだけでなく、クラス内のActionListenersを登録する方法を提供するだけです。

public class MyActionSubPub 
{ 
    private List<ActionListener> downstreams = new ArrayList<ActionListener>(); 
    public MyActionSubPub(AbstractButton(or whatever) button) 
    { 
     button.addActionListener(this); 
    } 
    public addActionListener(ActionListener listener) 
    { 
     downstreams.add(listener); 
    } 
    public void actionPerformed(ActionEvent event) 
    { 
     ... do your stuff ... 
     ... loop through all downstreams, call actionPerformed on each... 
    } 
} 

また、あなたは、一つのクラスにイベントを送信し、それが戻るのを待ち、その後、次のクラスにアクションを送信し、アダプタを作成することができます。

+0

さて、あなたは私のJavaの知識を進歩させました。これは私には何もありません。ありがとう。 –

2

これを行う1つの方法は、あなたのActionListeners「薄い」作り、それらを例えば、どこかのプライベートメソッドに委譲持っているだろう:

class Controller { 
    ... // variable declarations etc 

    public Controller() { 
     textField.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { 
      setStockSymbol(...); 
      replot(); 
     }}); 
     menuItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { 
      setStatusParameter(...); 
      replot(); 
     }}); 
    } 

    private void replot() { 
     // Do whatever 
    } 
} 

これは再プロットの一部を要因ActionListenersから。 replotをトリガするために他のコードパスが必要な場合は、それらを実装するのが簡単になり、プロットコードがパラメータ更新コードからきれいに分離されます。

関連する問題