1

GUI とモデルを含むアプリケーションを構築しています。モデル内のフィールドが変更されたときに、Observer パターン (Java の組み込みインターフェースを使用) を使用して GUI を更新しています。

これは通常は正常に機能していますが、モデル内の特定の文字列変数 (具体的にはファイルの URL) が、モデル変数の値を実際に反映する 2 つの別個の JTextField (swing) によって変更される可能性がある状況があります。問題があります。

私が抱えている問題は、これらの JTextField の 1 つを変更すると、モデルの状態と他の JTextField の内容を更新する必要があるという事実に起因しています。My Model は、モデルの状態が変化した場合にのみ通知がオブザーバーに送信されるようにします。ただし、JTextField を変更するプロセスでは、テキスト コンテンツを空白にしてからリセットする必要があります。

あまり詳細には触れませんが、これの結果は、更新/通知プロセスが無限ループに陥ることです。この特定の問題のためにオブザーバーパターンを脇に置いて一時的にハッキングしましたが、同じコンポーネントに起因する変更によって特定のコンポーネントが「更新」されないようにするためのきちんとした方法を誰かが提案できるかどうか疑問に思っていました。

どんな助けでも感謝します。

4

2 に答える 2

6

MVCを使用したJavaSEアプリケーション設計で説明したように、これはアプリケーション設計に関するいくつかの問題の1つです。提案されたアプローチは、ここPropertyChangeListenerに示されているに依存しています。には、参照用の古い値と新しい値の両方が含まれています。PropertyChangeEvent

于 2013-01-31T11:21:03.707 に答える
1

双方向オブザーバーについて説明しているこのリンクは、これに関するヘルプを提供する場合があります。

あなたの場合、モデルとビューがお互いを更新しようとしているようです。解決策は、更新の方向を強制することにあります。たとえば、Inner layer -> Model -> ViewおよびView -> Model -> Inner layer。したがって、それは実際には真のオブザーバー パターンではありません。

update(Observable o, Object arg)メソッドは(Subject) オブジェクトjava.util.Observerを受け入れます。Observableこのオブジェクトを使用して、モデルにヒントを提供し、更新をビューではなく内部に伝達するように依頼できます。

簡単に試してみたところ、双方向オブザーバー (Java API を使用) のセットアップは思ったほど単純ではないことがわかりました。しかし、あなたは挑戦することができます。

于 2013-01-31T12:36:41.123 に答える