アイテムのテーブルを作成するテーブルクラスがあります。テーブルモデルを使用して、これらのアイテムをJTableに表示したいと思います。私にとって、テーブルモデルは私のGUIパッケージに属していますが、テーブルは変更を実行するためにテーブルモデルを必要とし、テーブルモデルはそれを表示するためにテーブルクラスを必要とするため、2つを分離することはできません。これを行う必要がある場合、使用するクラス構造は何になりますか?または私は私の思考に流れがあり、それらは同じパッケージに属していますか?
5 に答える
ATableModel
はアダプターです。私は常にテーブル モデルを extends に記述し、AbstractTableModel
それを GUI パネル クラスのプライベート 内部クラスとして使用しています。いくつかのメソッドを入力するだけで済みます: getRowCount
、getColumnCount
およびgetValueAt
GUI クラスは、この情報を入力できるコントローラーにアクセスできる必要があります。コントローラーがデータの更新を検出すると、GUI クラスに通知し、AbstractTableModel.fireTableDataChanged
他の適切なメソッドを呼び出すことができます。
DefaultTableModel
テーブルモデルのデータとコントローラーのデータの同期を保つ必要があるため、クラスを使用しないでください。JTable
前述したように、テーブル モデルは、コントローラのデータを理解できる方法で表示するアダプタです。
私にとって、テーブルモデルはウィジェットの一部、つまりGUIです。ビジネスロジッククラスのjavax.swingパッケージには依存しません。
したがって、アダプターまたはその他のメカニズムを使用して、ビジネスレイヤーからテーブルモデルをロードしますが、この程度の分離が役立つ場合があります。
決定はプロジェクトのサイズにも依存し、これよりもはるかに複雑になる可能性があります。たとえば、より抽象的なケースについては、 jgoodiesバインディングフレームワークとドキュメントを参照してください。
モデルは、データを保持するビットです。このようなモデルと同様に、リスナーを維持および起動する必要があります。
ここで、データを変換したり、タイプを適合させたりするために、モデル内にある種の委任が必要になる場合があります。したがって、データは必ずしもjavax.swing.tableとは関係のないモデルオブジェクトにあります。次に、基になるモデルに委任するTableModelを実装します。そのTableModelを使用してJTableを作成しますが、基になるモデルへの参照はありません。
重要なテーブルまたはリスト駆動型の開発を行っている人は誰でも、 Glazed Listsを確認することを強くお勧めします。私はカスタム TableModel と CellRenderers を何年も作成し、JGoodies などとバインドしてきました。 Glazed Lists のアプローチは驚くべきものです。
GL には 2 つの特徴があり、リスト ベースのデータ バインディングと処理のフレームワークとして選択しています。
- あなたがやりたい普通のことをするのはとてもとても簡単です
- あなたがやりたいかもしれない本当に、本当に難しいことを可能にします
見て、感動しないかどうかを確認してください。サンプル アプリで遊んでから、実際のコーディング プロセスを説明するスクリーン キャストをいくつか見ることを強くお勧めします。
テーブルモデルは、配置されているテーブルについて何も知る必要はありません。テーブルモデルをモデルパッケージに入れ、テーブルをビューパッケージに入れます。コントローラは、モデルのモデルパッケージを要求し、テーブルのビューパッケージを要求し、そのモデルをテーブルに設定する責任があります。