4

プロジェクトに MVC パターンを使用しています。新しい Customer を作成し、リスナーとしてbtnAdd追加します。MyJPanel1Customer がその状態を変更すると、イベントcustomerChangedが発生して呼び出されます。が 呼び出されると、何らかのアクションが実行されMyJPanel1customerChanged

  1. その顧客の話を聞くのをやめなければなりません
  2. 他のビューは、その顧客の話を聞き始める必要があります

他のビューのいくつかは同じ動作をします。MyJPanel1customerChangedメソッド自体に実装したこれらの 2 つの要件。

更新された

私の質問と問題は次のとおりです。

  1. これはMVCの観点から正しいですか、それとも何らかの方法で処理する必要がある他のエンティティ(コントローラー?)が必要ですか?
  2. 顧客がfireEventメソッドを起動すると、リスナーからそれ自体c.removeListener(this);が削除され、これによりリスナーのfor` ループでエラーが発生しました。MyJPanel1fireEvent' becausein

助けていただければ幸いです。

class Customer {
    // ...

    private void fireEvent(CustomerEvent event) {
        for (IListener listener : listeners) {
            listener.customerChanged(event);
        }
    }
}

class MyJPanel1 extends JPanel implements IListener {
    MyJPanel2 otherPanel;

    MyJPanel1(MyJPanel2 panel) {
        this.otherPanel = panel;
        createGui();
    }

    private void createGui() {
        JButton btnAdd = new JButton("Add");
        btnAdd.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                Customer c = new Customer();
                c.addListener(this);
            }
        });
        // ...
    }

    @Override
    public void customerChanged(CustomerEvent event) {
        if (event instanceof AddedCustomerEvent) {
            Customer c = event.getCustomer();
            // do something
            c.removeListener(this);
            c.addListener(otherPanel);
        }
    }
}
4

1 に答える 1

0

ビューはデータを表示するだけです。単独で機能することはありません。

コントローラーの目的は、変更 (リスナーの追加/削除など) です。モデルをビューに接続し、すべてが機能することを確認します。ビューを可能な限りダムにします。

2 番目の問題について: お気づきのように、自殺するリスナーを持つことはできません。いくつかの解決策があります。

  1. リスナーからブール値を返し、「完了しました。私を削除してください」と言います。ループは次のようになります。

    for (Iterator<IListener> iter = listeners.iterator(); iter.hasNext(); ) {
        if (!listener.customerChanged(event)) {
            iter.remove();
        }
    }
    
  2. 削除されない新しいリスナーを作成します。代わりに、このリスナーがイベントを関心のあるビューに転送できるようにします。つまり、MyJPanel1そのビューが完了するまでイベントが送信されます。これから、イベントは他のビューに移動します。

    良い解決策は、新しいリスナーが 2 つのイベントをリッスンするようにすることCustomerEventです。IAmDoneEventMyJPanel1

    リスナーのリストが 2 つあります。が受信されるまでIAmDoneEvent、すべてCustomerEvent最初のリストに移動します。このイベントの後、すべてCustomerEventが 2 番目のリストに移動します。最初のリストに追加MyJPanel1し、他のすべてのビューを 2 番目のリストに追加します。

    コントローラーを使用して、このリスナー ネットワークを構築します。

于 2012-06-30T20:19:11.557 に答える