2009-12-04 9 views
6

「深刻な」Java GUIアプリケーションでは、多くのGUI要素の後ろにモデルがあります。たとえば、の場合、JEditorPane、またはListModelの場合はJListです。Swingワーカースレッドの外でモデルを変更することはできますか?

私たちは、常にSwingワーカースレッドの外からGUIを変更しないように指示しており、そのためにはSwingUtilities.invoke...()が与えられています。まあ、私はそれで生きることができます! GUIコンポーネントの属性を直接変更する場合は、確かに必要です(うまく機能します)。

理想的には、GUIで表示される変更のほとんどはJComponentsではなくモデルになります。しかし、GUIで表示可能なので、GUIの変更に応じて「数えますか」?私。イベントを変更してリスナーが必要なデカップリングを提供するか、またはモデルの変更をinvoke...()にラップする必要がありますか?

おそらく、スイングプロの古い帽子ですが、私は明確に何らかの言及を見つけることができませんでした。

答えて

5

一般に、モデルの変更はinvokeLater(...)にラップする必要があります。私が見たスイングクラスのほとんどのモデルのコードにはデカップリングはありません。

Event Dispatcher ThreadでGUIの変更が行われたかどうかをチェックするコールを含むモデルを作成する必要があります。

+1

-1:私が聞きたい答えではありません! (ちょうど冗談、+1)ありがとう! –

+1

スウィングスレッドに関するデバッグの問題については、このリンクをお勧めします: http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html CheckThreadViolationRepaintManagerは私に多くの時間を節約しました。 –

+1

テキストをスイングすると、イベントがEDTにシフトされます。もちろん、それはちょうど大きな混乱を作ります。 –

2

イベントがEDTから発せられ、問題となるSwingコンポーネントを更新する場合。

スイングテキストでは、イベントはEDTに転送される場合もあれば、転送されない場合もあります(!)。これにより、テストが難しくなります。当然のことながら、このAPIはマルチスレッド環境では役に立ちません。

So:EDTにモデルを保存しておくと、他のスレッドがメッセージを通過する(EventQueue.invokeLaterを含む)のが最も簡単です。あるいは、あなたはすべてのものの周りに大きな鍵をかけることができます。これはもっと困難です(EDTに物を渡す必要があるでしょう)。マイクロ同期の試みは非常にです。

+1

"マイクロ同期化は非常に困難です。"私はこの点に完全に同意します。同期したすべてのキーワードを削除し、GUIのすべての変更(およびGUIの要素のモデル)がEDTで行われたことをより注意深くチェックしました。 –

+1

私はこれを恐れていました。これは、私のモデルが技術的にGUIの一部となり、この目的のためにモデルの一部として扱われなければならないことを意味します。それはレイヤリング/カプセル化の観点からは「きれい」ではないように見えますが、これは私の最大の反論です。 +1、ありがとう! –

2

はい、間違いなくOKです。

EDT以外のSwingコンポーネントは変更しないでください。 EDTの外でモデルを確実に変更することができます。

モデルをSwingコンポーネントに正しく配線した場合、ビューの更新、したがってEDTのスケジューリングはほぼ自動的に行われます。

参照:http://java.sun.com/products/jfc/tsc/articles/architecture/#roots

は、JavaBeansのイベントモデルについての部分を参照してください。

これは、モデルが変更された状態をEDTで安全にGUIに伝達する方法です。新しいGUIコンポーネントを作成するときは、このデザインパターンに従ってください。

GUI状態モデルとアプリケーションデータモデルの区別にも注意してください。

EDTからモデルを変更する場合でも注意が必要です。実際、ほとんどのSwingの問題は、EDTのモデルを別のスレッドから修正する必要があるときに、プログラマがモデルを変更しているときに発生します。(GUIの異常なGUIの異常)

また、これは、一般的なマルチスレッドの落とし穴を完全に意識しているわけではありません。

しかし、EDTの外からJTableModelを変更することは間違いありません。

関連する問題