プロジェクトに MVC パターンを使用しています。新しい Customer を作成し、リスナーとしてbtnAdd
追加します。MyJPanel1
Customer がその状態を変更すると、イベントcustomerChanged
が発生して呼び出されます。が
呼び出されると、何らかのアクションが実行されMyJPanel1
、customerChanged
- その顧客の話を聞くのをやめなければなりません
- 他のビューは、その顧客の話を聞き始める必要があります
他のビューのいくつかは同じ動作をします。MyJPanel1
のcustomerChanged
メソッド自体に実装したこれらの 2 つの要件。
更新された
私の質問と問題は次のとおりです。
- これはMVCの観点から正しいですか、それとも何らかの方法で処理する必要がある他のエンティティ(コントローラー?)が必要ですか?
- 顧客が
fireEvent
メソッドを起動すると、リスナーからそれ自体c.removeListener(this);
が削除され、これによりリスナーのfor` ループでエラーが発生しました。MyJPanel1
fireEvent' because
in
助けていただければ幸いです。
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);
}
}
}