2

2つのJTableを介して表示する必要のあるデータがいくつかあります。データは同じですが、テーブルごとに少し異なって表示する必要があります。また、外部接続(この場合はJMSですが、実際には問題ではなく、DBなど)からデータを受信します。

私はSwingを初めて使用するため、誰がイベントを発生させるか、誰がイベントをリッスンするか、データセットを変更するために両方のテーブルを更新する方法について、まだ少し混乱しています。

さて、私のデータセット構造の小さな例といくつかのダミーデータ:

class Student{ String name; Classroom classroom; boolean goodStudent}
class Classroom{ Sting name; List<String> coursesTaught; List<Student> students;}

public List<Classroom> classes;

基本的に、私のデータセットはclassesControllerクラスのフィールドになり、2つのJTableは異なる方法で物事を表示する必要があります。つまり、Table1は次のようなものを表示する必要があります。

Classroom Name | Courses
4a             | CS101, CS102, CS103
4b             | BM101, CS102
4c             | I101, CS4100

つまり、基本的に、各クラスルームのコースのリストです。

Table2は、代わりに次のようなものを表示する必要があります。

Student Name   | Good?
Mark Spencer   | true
Philippe Mann  | true
Tom Sayer      | false

すべての教室から、すべての生徒に会う必要があります。

ご覧のとおり、データは同じですが、表示方法が異なります。私がやりたいのは、データが変更されると、テーブルも自動的に更新されるということです。これまで理解してきたこととして、AbstractTableModelをサブクラス化し、表示したい種類のデータ用に2つの異なるTableModelを作成する必要があります。私が得られないのは:

  • 何らかの変更が発生した場合、モデルはどのようにデータを取得しますか?
  • 誰がこの変更をモデルに通知する必要がありますか?
  • 「fireTableXXXEvent()」を呼び出してビューの更新をトリガーするだけで十分ですか?

私は自分自身を十分に明確にしたことを願っています...とにかく、どうもありがとうございました!さよなら

4

2 に答える 2

4

@StanislavLはTableModel、それぞれJTableにaが必要であることについては正しいですが、共通の抽象的な親から有効に派生できないとは言えません。以下の(やや工夫された)概要では、2つのモデルは共通のgetColumnCount()実装を共有していますが、具体的な子は残りの必要なTableModelメソッドを実装しています。

abstract class SchoolModel extends AbstractTableModel {

    @Override
    public int getColumnCount() { return 2; }
}

class ClassroomModel extends SchoolModel {

    @Override
    public int getRowCount() {…}

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {…}
}

class StudentModel extends SchoolModel {

    @Override
    public int getRowCount() {…}

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {…}
}
于 2011-12-22T13:56:20.327 に答える
3

あなたが正しいです。2 つの AbstractTableModel が必要です。リスト List classesList classes をメイン データ ソースとして持っているとします。最初のモデルの行数は、リストの size() を返すだけです。2 つ目は、各教室の生徒数の合計を返します。両方のモデルの列数は 2 です。興味深いメソッドは getValueAt/setValueAt で、適切な行を見つける必要があります。最初のリストについては、適切なリスト アイテムを選択するのは簡単です。2 番目のテーブル モデルでは、適切な行を計算してから、生徒のリストを反復処理する必要があります。DBで何かが変更されたとします。新しいリストを取得します。何が変更されたか、どの行/列が挿入/削除/変更されたかを見つけるか、両方のモデルでデータ ソース リストを置き換えて構造変更イベントを発生させ、JTable がコンテンツを完全に更新できるようにすることができます。モデルの自動更新はありません。

于 2011-12-22T09:46:33.857 に答える