2009-06-15 16 views
2

GUIデザイン、特にJava Swingを使用し、プレゼンテーションとモデルを明確に分離することについて質問があります。GUI:コンボボックスの値に基づいてパネルを変更する

説明するのは少し難しいですが、本質的に私たちのシステムには多くの参照データがあります(つまり、DBのルックアップテーブルに対応する)。人々は1つの画面からすべてを編集できるようにします。

したがって、理想的な世界では、左上隅のコンボボックスに、参照データの「タイプ」のリスト(それぞれがDBの1つのテーブルに対応しています)が表示されます。

次に、選択すると、データのリストには、フィルタ(または検索ボックス)も表示されます。これらの項目のいずれかを選択すると、右側のパネルがアクティブになり、実際のデータを編集することができます。

編集しなければならないデータの種類はそれぞれ異なりますので、フィールドなどが異なります。一般的な解決方法があるかもしれませんが、私はそれらのファンではありません。それぞれのクライアントごとに異なる検証ルールがあり、管理するのは悪夢です。

GUIコードとモデルの間にある程度の分離を実現するために、Presentation Modelパターンを使用していますが、これを行うためのきれいな方法は考えられません。

あなたはこのような問題をどのように解決しましたか?

[注:長い質問の謝罪は、必要に応じて、私は再フレーズができ、それは理解できる願っています]

答えて

1

あなたが選択されている要素のためのUIウィジェットを作成するためにFactory Patternを使用することができます。タイプに応じて検証ルールオブジェクトを作成するのにも使用できます。これは、あなたが望む柔軟性のいくつかを与えるでしょう。選択した要素を編集する権利ウィジェットを作成するために、選択イベントで呼び出すことができ

IWidget widget = UIFactory.createFor(myObject.getType()) 

だからあなたのようなものを持つことができます。あなたは一般的にすべてのUIウィジェットを扱うことができ、それでも各要素型のための特別なUIウィジェットを持っているでしょう

validateData() 
refreshData() 
setDataElement(IDataElement element) 

のiWidgetは、次のようなメソッドを持つことができます。私はあなたがテーブルから選択している要素はすべて、getType()メソッドを含むIDataElementインタフェースを実装していると仮定しています。

私はこのソリューションをEclipseエクステンションメカニズムと結びつけて、新しいUI要素を自分の「ベース」ソリューションに差し込み、拡張可能なコアと高いレベルの再利用を実現しました。手動またはSpringを使用して、タイプとウィジェットを工場に注入することで、同様のことを実現できます。

+0

ありがとうございました。 :) –

0

一般的なパスを使いたくない場合は、モデルにコンボボックスの項目 - >パネル名のマッピングを保持させて、CardLayoutと一緒に使用させることができます。次に、参照データ型のそれぞれを編集するためのカスタムパネルを作成することができます。コンボボックスの選択が変更されると、現在の状態をモデルに保存し、現在の選択のパネル名を要求し、次のパネルの表示を準備してからCardLayoutに表示させることができます。

関連する問題