スイング:複数のオブジェクトの単一のAbstractTableModel ??

I have different objects which is used to store the data from DB in an ArrayList. I got to show records of each in a Table. I use an AbstractTableModel for first object am working on. The AbstractTableModel class has an ArrayList and an String[] of headers.

My question is : How do I create the same AbstractTableModel that can be used for all objects. I mean if working with Relation, I can have ArrayList, if with Product, can have ArrayList ..etc. Writing different AbstrastTableModel for each is not a good idea according to me. The main problem comes with setValueAt, getValue, addRow....

    @Override
public void setValueAt(Object value, int row, int col) {
    Relation r = data.get(row);    //ArrayList data
    switch (col) {
        case 0:
            r.setId(value.toString());
            break;
        case 1: r.setName(value.toString());
            break;
        case 2: r.setStartBalance((Double)value);
            break;
        case 3: r.setCurrentBalance((Double)value);
            break;
    }
}

これをすべての人のために働く単一のモデルとして扱う良いアイデア。また、ここからテーブルのイベントを発砲することもできます。

私はそれが少し複雑であることを知っています。しかし、その構造は膨大であり、各オブジェクトに対して新しいクラスの AbstractTableModel JTable を作成することも良い考えではありません。

何を指示してるんですか ?

3
私は明確な質問ではない、あなたは異なったObjects.Classを1つのColumnに入れるか、それぞれのColumnに独自のObject.Classを設定したくないのか、両方の方法がかなり可能ですが、
追加された 著者 mKorbel,
@kleopatra、それは私のやり方であり、うまくいきます。モデルへの変更を追加/反映し、変更を受信すると適切に起動します。
追加された 著者 Tvd,
これはモデルの違法実装と似ています。つまり、変更時にリスナーに通知する必要があります。つまり、fireXXUpdatedです。関係が可能である可能性があるため、プロパティーの変更で発生するBeanであり、モデルは変更を受け取り、変更を受け取ったときに発生します。これは、いずれにせよ適切なシナリオです。[] "Looks" :-)
追加された 著者 kleopatra,

2 答え

複数のデータクラスに対して、setValue(int columnNumber、Object Value)や同様のgetValue()メソッドなどのメソッドを公開するような抽象化を作成できます。次に、この新しい抽象化にAbstractTableModelを記述することができます。その後、必要なテーブルモデルを作成するだけで、モデルのコンストラクタでデータクラスを変更する必要があります。

例えば、あなたはインターフェイスを持つことができます:

interface DBRow
{
    public void setValue(int columnNumber, Object value);
    public Object getValue(int columnNumber);
}

ProductクラスとRelationクラスの両方でこれを実装する必要があります。そして、あなたのモデルはDBRowインターフェイスで動作します。

You can also consider directly using resultset for populating tables: resultset-to-tablemodel

3
追加された
あなたはあなたの要点を詳述できますか?私は100%明確ではない。たぶん、クラスの定義だけでそのアイデアがより良くなるかもしれません。
追加された 著者 Tvd,
AKJ、このhelepdに感謝します。それでも、私はテキストフィールドを追加して新しいウィンドウを開きます。そのために、Panelオブジェクトを修正するためにオブジェクトを渡さなければなりません。 Panelオブジェクトを追加/編集した後、再びこのテーブルを表示する必要があります。
追加された 著者 Tvd,
私の答えを更新しました。
追加された 著者 Ashwinee K Jha,

私の意見では、1つのオブジェクトタイプに対して1つの AbstractTableModel を使用する必要があります。たぶん、データモデルを再考する必要があります。

Anyway, the dirty way of solving this could be to use an ArrayList in your AbstractTableModel and check in your getValue()-method the type with instanceof. Then you can decide per object type which parameter you return of that particular object.

例:

@Override
public void setValueAt(Object value, int row, int col) {
    Object r = data.get(row);    //ArrayList data
    switch (col) {
        case 0:
            if (r instanceof Relation) {
               ((Relation)r).setId(value.toString());
            } else {
              //do something with Product
            }
            break;
    }
}

それはあなたのために働くことができますか?

0
追加された
私はすでにこの考え方を念頭に置いていましたが、より良い実装方法を考えていました。
追加された 著者 Tvd,