2

私は最近、JavaでSwingアプリケーションを使い始めましたが、現時点では主にJTableを使用しています。MVVMデザインパターンを使用して途方もなくアーキテクチャ化された.NETWPFバックグラウンドの世界から来て、私はSwingに少し苦労しています。その理由は、JTablesを使用すると、Model-View-Controllerパターンを実装できる方法がたくさんあるようです(少なくとも、利用可能なクラスを見た後で感じること)。結果として、私は私の心を通してcmaeし、これまでに見たいくつかの可能な一般的なアプローチを共有し、他のコントロール/アプリケーションに適用できる可能性のあるこの問題についてのコメントを収集したいと思いました。

  1. JTable <-> TableModel:このアプローチでは、ある意味でビューとモデルしかありません。TableModelには、setValueAtなどの更新に役立つメソッドがあります。このメソッドでは、UI更新の処理コードを配置し、モデル更新でイベントを発生させることができます。これがDefaultTableModelのデフォルトの実装だと思います。したがって、モデルはセル(データ)に対して直接行われた更新を処理します。ビュー(JTable)は、ビューとして機能するクラスの背後にあるコードに、それ以降のハンドラーを登録します。コードは次のようになります。

    クラスビューはJPanelを拡張します{

    public View(TableModel model) {
        super(new BorderLayout(1, 0));
        JTable table = new JTable(model) {
    
            //override anything you need here - renderers etc.
    
        };
    
        //add any listeners here
    }
    //Listeners that would perform actions on events, and possibly call model to update
    

    これについて私が気に入っているのは、コードを配置する場所が2つしかないことと、実装で提供されるJTableとTableModelの間に自然な接続、つまりsetValueAtメソッドがあることです。しかし、これについて私が嫌うのは、MVVMの場合にコードを見事に構造化したMVCパターンを完全に無視することです。

  2. JTable-> Controller <-> TableModel:ロジックを実行するための別のレイヤーを追加します。これで、ビューとモデルをインスタンス化する(またはコンストラクターに挿入される)中央コントローラーができました。さらに、ビューにリスナーを登録します。これが発生するたびに、モデルで更新メソッドを呼び出します。おそらくさらに別のアプローチは、ビューの登録済みハンドラーからコントローラーにイベントを転送することですが、それはコントローラーについて知るためにビューを必要とします...私はビューにイベントの発生を推測しますテーブルでtableChangedメソッドを呼び出すだけでない限り、updateメソッドを呼び出すと、モデルに残ります。ただし、これにより、TableModelの実装で無料で提供されるイベントメカニズムの全体的なすっきりが台無しになります...ここで考慮しなければならないさらに重要なことは、処理するたびにビューインデックスからモデルインデックスへの変換に注意する必要があるということです。ビューからのイベント(おそらく現時点では考えられない他の考慮事項)

  3. JTable <-> TableModel-> BusinessModel:TableModelをコーディネーターとして使用し、ビジネス知識を他の場所に保持します。これまでのところ、TableModelには、たとえばリストの形式で生のビジネスデータが含まれていると想定していました。これで、TableModelでsetValueAtメソッド+レジスタハンドラーを使用できる可能性があります。これにより、基になるBusinessModelが変更され、リストがカプセル化されます。私の唯一の恐れは、TableModel実際にはモデルであり、コントローラーではないことです。

これらはこの問題に関する私の見解です。返信やコメントをお待ちしております。

4

2 に答える 2

2

Swing MVCモデルは、ビューをモデルから厳密に分離していないことを理解しています。つまり、コントローラーを不必要に通過しないように、2つの間に何らかの通信があります。私が使用しているとき、JTableはビューであり、TableModelはモデルであり、リスナーは「モデルの内容を表示する」だけでなく、より多くの制御が必要なもののコントローラーとして機能します。

于 2012-08-03T11:00:14.933 に答える
2

明確にするために、Swingの分離可能なモデルアーキテクチャは、ここに示すように、オブザーバーパターンを使用してモデルとビューを大まかに結合します。通常は内部で使用されますが、他の実装についてはここで説明します。UIデリゲートは、ビューとのユーザー操作を制御します。これにより、コンポーネントは、ユーザーが認識しているように、異なるプラットフォームで正しく動作することができます。EventListenerList

Listenerでは、モデルは特定のインターフェイスを介してビューコンポーネントに登録されますか?

いいえ、各モデルはEventListenerList内部で維持されます。addXxxListener()対応する各ビューは、モデルのメソッドを介してリスナーとして自分自身を追加します。ほとんどのコンポーネントはPropertyChangeLister、バインドされたプロパティにも使用されます。

于 2012-08-03T19:55:37.480 に答える