私は最近、JavaでSwingアプリケーションを使い始めましたが、現時点では主にJTableを使用しています。MVVMデザインパターンを使用して途方もなくアーキテクチャ化された.NETWPFバックグラウンドの世界から来て、私はSwingに少し苦労しています。その理由は、JTablesを使用すると、Model-View-Controllerパターンを実装できる方法がたくさんあるようです(少なくとも、利用可能なクラスを見た後で感じること)。結果として、私は私の心を通してcmaeし、これまでに見たいくつかの可能な一般的なアプローチを共有し、他のコントロール/アプリケーションに適用できる可能性のあるこの問題についてのコメントを収集したいと思いました。
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パターンを完全に無視することです。
JTable-> Controller <-> TableModel:ロジックを実行するための別のレイヤーを追加します。これで、ビューとモデルをインスタンス化する(またはコンストラクターに挿入される)中央コントローラーができました。さらに、ビューにリスナーを登録します。これが発生するたびに、モデルで更新メソッドを呼び出します。おそらくさらに別のアプローチは、ビューの登録済みハンドラーからコントローラーにイベントを転送することですが、それはコントローラーについて知るためにビューを必要とします...私はビューにイベントの発生を推測しますテーブルでtableChangedメソッドを呼び出すだけでない限り、updateメソッドを呼び出すと、モデルに残ります。ただし、これにより、TableModelの実装で無料で提供されるイベントメカニズムの全体的なすっきりが台無しになります...ここで考慮しなければならないさらに重要なことは、処理するたびにビューインデックスからモデルインデックスへの変換に注意する必要があるということです。ビューからのイベント(おそらく現時点では考えられない他の考慮事項)
JTable <-> TableModel-> BusinessModel:TableModelをコーディネーターとして使用し、ビジネス知識を他の場所に保持します。これまでのところ、TableModelには、たとえばリストの形式で生のビジネスデータが含まれていると想定していました。これで、TableModelでsetValueAtメソッド+レジスタハンドラーを使用できる可能性があります。これにより、基になるBusinessModelが変更され、リストがカプセル化されます。私の唯一の恐れは、TableModelが実際にはモデルであり、コントローラーではないことです。
これらはこの問題に関する私の見解です。返信やコメントをお待ちしております。