2

この質問の冗長性を許してください。これを書いているのは、設計上の問題を考えようとしているからです!

RMI アプリケーションへの再構築が必要な Swing アプリケーションを継承しました。お客様は、Swing GUI をローカルで実行し、RMI を介してリモート サーバー プロセスと通信する必要があります。これには、Swing クライアント間のギャップを埋める EventListeners によって刺激されたときに、ビジネス ロジックのセクションとバックエンド データベースの永続性への呼び出しを指示するコントローラー クラスが含まれます。そしてコントローラー。

サーバーで使用するために新しいビューを開発できるように、MVC 設計を実装します。

現在、Swing クライアント GUI には、DefaultTreeModel を使用して設定された JTree が含まれています。このモデルは、DefaultMutableTreeNode オブジェクトを使用して構築されます。このオブジェクトには、これらのオブジェクトとデータ ソースの間にある BusinessObject マッパーを介してビジネス オブジェクトの状態が取り込まれます。

Client と TreeModel がどのようにリンクされているかを理解するのに問題はありません。TreeModel への変更を監視するために TreeModelListener を確立しました。TreeModel オブジェクトが変更された場合は、treeHasChanged() メソッドを呼び出して JTree を再描画します。

しかし、どのプロセスが TreeModel を刺激するのかを想像しようとして頭が痛くなり、その内容がデータベース内の最新のデータで再作成され、次に TreeModelListener が呼び出されて GUI の Jtree が更新されます。TreeModel を「所有」するのは誰ですか? コントローラーの状態の一部を構成するモデル内のクラスである必要がありますか? GUI の EventListeners によるコントローラーのアクションは、TreeModel を更新するルーチンを実行するためにハード コールを行う必要がありますか?

あるいは、TreeModel は GUI ウィジェットの拡張であり、その場合はビュー コンポーネントですか? もしそうなら、このオブジェクトの状態のリフレッシュを呼び出す適切な方法は何でしょうか?

ここ数日、私はオブザーバーとリスナーの観点から考えてきたので、オブザーバーの発砲の背後で発生する動作を呼び出そうとしていることにおそらく罪を犯していることに注意する必要があります。

あなたは、非常に混乱しています!

4

3 に答える 3

2

AbstractTreeModel または DefaultTreeModelについて説明したかどうかはわかりませんが、この記事 の TreeModel を理解することが依然として最善であり、 JTree チュートリアルにリンクしていると思います。

本当の助けを得るには、質問を編集headacheしてSSCCEフォームに画像を投稿する必要があります。作成するための優れたベースがたくさんあります。SSCCE

于 2011-11-25T17:58:04.720 に答える
2

@mKorbel の有益なリンクと @Shakedown のコメントにSwingWorker加えて、中間層と定期的にランデブーして更新することをTreeModel検討してくださいTimerここに関連する例があります。クエリの実行中、GUI は応答し続けることに注意してください。もちろん、更新を実行する必要がある頻度と GUI を更新する頻度は、アプリケーション次第です。

于 2011-11-25T19:05:43.513 に答える
0

私は問題に頭を悩ませました。

私のアプリケーションは多くの異なるタイプの UI (ヘッドレス、Swing、Web) を使用できるアプリケーションであるため、Swing API がアプリケーションのモデルに存在することは悪い考えであると判断しました。

したがって、TreeModel オブジェクトをビュー内に配置し、関心のある UI にモデル層の一般的なプレゼンテーションへのアクセスを提供するビュー ヘルパーによって設定するのが正しいアプローチであると判断しました。

于 2011-12-05T18:06:35.317 に答える