3

DB からのデータを に格納するために使用されるさまざまなオブジェクトがありますArrayList<T>。それぞれのレコードをテーブルに表示する必要がありました。私AbstractTableModelは作業中の最初のオブジェクトに使用します。AbstractTableModelクラスにはArrayList<Relation>およびのString[]ヘッダーがあります。

AbstractTableModel私の質問は次のとおりです。すべてのオブジェクトに使用できる同じものを作成するにはどうすればよいですか。つまり、Relation を使用する場合は を使用できArrayList<Relation>、Product を使用する場合はArrayList<Product>.. を使用できます。私によると、それぞれに異なるものを書くことAbstrastTableModelは良い考えではありません。主な問題はsetValueAt、、、....getValueaddRow

    @Override
public void setValueAt(Object value, int row, int col) {
    Relation r = data.get(row);     // ArrayList<Relation> 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、各オブジェクトの新しいクラスを作成することもお勧めできません。

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

4

2 に答える 2

0

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

とにかく、これを解決する汚い方法は、でを使用ArrayList<Object>し、 -メソッドでタイプをAbstractTableModelチェックインすることです。次に、オブジェクトタイプごとに、その特定のオブジェクトから返すパラメータを決定できます。getValue()instanceof

例:

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

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

于 2011-11-25T09:13:29.503 に答える