2011-02-04 9 views
3

FYI私はSwing on Javaで自分のGUIにメディエーターパターンを採用しました。GUIメディエータで並行変更例外を克服するにはどうすればよいですか?

残念ながら、ユーザー入力に新しいウィンドウが必要な場合は、同時変更例外が常にスローされます。

私のコードは、既存の同僚(ウィンドウ)からのユーザー入力を処理する過程で、新しい同僚(新しいウィンドウ)をメディエータの同僚のリストに追加しようとしているからです。

public MainScreenColleague implements GuiColleague, ActionListener { 
    private GuiMediator mediator; 
    public MainScreenColleague(GuiMediator medi) { 
     mediator = medi; 
     // implement JFrame with JButtons 
    } 
    public conveyInputToMediator(EventObject event) { 
     mediator.conveyInputToColleagues(event); 
    } 
    public receiveInputFromMediator(EventObject event) { 
     if (event.getSource() = particularBtn) { 
      GuiColleague particularColleague = new ParticularConcreteColleague(mediator); 
      //THIS IS THE CODE THAT THROWS CONCURRENCY EXCEPTION 
      mediator.addGuiColleague(particularColleague); 
     }  
} 

私が採用できる新しい同僚を追加する処理の他の構造がありますか?提案やアイデアを事前に感謝します。

答えて

1

スイング・エスクモデルを採用し、仲介者に、時間が正しいときに必要な更新の「イベントキュー」を保存することがあります。そうすれば、他のオブジェクトからイベントを処理しているときに新しいウィンドウを追加するときに、そのウィンドウはロジックをガムしません。仲介が完了した後に処理される「完了したらこれを処理する」キューに追加されます。

リストアを繰り返す前にリストのコピーを作成して、反復処理中に生の構造に加えられた変更が、反復処理中のリストに表示されないようにすることもできます。

さらに別のアイデアは、要素を訪問するための非イテレータ技術を使用することです。たとえば、リストに格納されているウィンドウがある場合は、次のようなforループを使用できます。

for (int i = 0; i < elems.size(); ++i) 
    /* ... */ 

これらの例外は発生しません。

+0

+1非常に有用な代替品です!ありがとう。 – Arvanem

1

トラバーサルが変更よりもはるかに多い場合、CopyOnWriteArrayListのようなコピーオンライトデータ構造が適合する可能性があります。

+1

+1は非常に興味深い提案です!ありがとう。 – Arvanem

+0

@Arvanem - 喜んで助けてください –

関連する問題