2

実行時に独自の JTable モデルにデータを追加したいと考えています。インターフェイスにテーブルと追加ボタンがあります。私が理解しているように、2次元配列ではできず、カスタムメイドのテーブルモデルでArraylistを使用したいのですが、そのようなタイプのデータを使用する場合にコンストラクターを作成する方法がわかりません。

static String[] columnNames = {"A", "B", "C"};
static Object data[][] = new Object[15][3];

public MyTableModel() {
   super(data, columnNames);
}

これは 2 次元配列としてのデータのコンストラクタですが、使用したいのは次のとおりです。

ArrayList<Object[]> data = new ArrayList<Object[]>();

作り方

4

3 に答える 3

4

それを行う1つの方法は、を使用することAbstractTableModelです。次に例を示します。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;

public class TestTable {

    public static class MyModel extends AbstractTableModel {

        private List<Object[]> data;
        private List<String> columnNames;

        public MyModel(List<String> columnNames, List<Object[]> data) {
            super();
            this.columnNames = columnNames;
            this.data = data;
        }

        @Override
        public int getRowCount() {
            return data.size();
        }

        @Override
        public int getColumnCount() {
            return columnNames.size();
        }

        @Override
        public String getColumnName(int column) {
            return columnNames.get(column);
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return data.get(rowIndex)[columnIndex];
        }

    }

    protected void initUI() {
        JFrame frame = new JFrame(TestTable.class.getSimpleName());
        List<String> columns = Arrays.asList("Name", "Age");
        List<Object[]> data = new ArrayList<Object[]>();
        for (int i = 0; i < 50; i++) {
            Object[] value = new Object[2];
            value[0] = "Name-" + i;
            value[1] = 12 + i;
            data.add(value);
        }
        JTable table = new JTable(new MyModel(columns, data));
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTable().initUI();
            }
        });
    }
}

を変更する必要がある場合はdata List<Object[]>、適切なテーブル イベントを発生させることを忘れないでください。AbstractTableModelそれらすべてがすでに含まれています。

于 2012-11-07T17:48:02.580 に答える
0

テーブル モデルの完全なソース コードが含まれていないため、何をしているのかわかりにくいため、ここでいくつかの仮定を立てます。

あなたはおそらく拡張しているAbstractTableModelか、DefaultTableModel. いずれの場合も、コンストラクターを介してモデルにデータを追加する必要はありません。TableModel代わりに、拡張機能で次のメソッドをオーバーライドする必要があります。

getRowCount()

getColumnCount()

getValueAt(int row, int column)

これらの各メソッドがオブジェクトにインデックスを付けるようにします。ArrayList<Object[]> dataたとえば、 のgetValueAt(row,column)ようなものを返す必要がありdata.get(row)[column]ます。次に、を追加するTableModelJTable、カスタムデータの表示に関する限り、準備が整います。

今...data変更すると(テーブル内のセルの値を変更したか、行を追加/削除したかのいずれか)、 (拡張またはそのサブクラスの1つを想定してfireTableDataChanged())呼び出すだけです。これにより、基になる に加えた変更で UI が強制的に更新されます。TableModelAbstractTableModeldata

于 2012-11-07T17:47:39.073 に答える
0

独自のテーブル モデルを作成する最も簡単な方法は、AbstractTableModel から継承することです。次に、少なくとも getRowCount、getColumnCount、および getValueAt をオーバーライドします。

次に、「new JTable(mymodel)」を使用してテーブルを作成できます。ここで、「mymodel」は作成したモデルのインスタンスです。または、「new JTable」だけでテーブルを作成し、後で setModel を実行して、モデルを JTable に追加します。

たとえば、私はこれを何億回も行ってきましたが、これを頭のてっぺんから書いているので、明示または黙示の保証はありません。おそらく、どこかに構文エラーが1つまたは2つあります。

class ArrayListModel extends AbstractTableModel
{
  ArrayList<Object[]> list;

  public ArrayListModel(ArrayList<Object[]> list)
  {
    this.list=list;
  }
  public int getRowCount()
  {
    return list.size();
  }
  public int getColumnCount()
  {
    if (list.size()==0)
    {
      return 0;
    }
    else
    {
      return list.get(0).length;
    }
  }
  public Object getValueat(int row, int column)
  {
    return list.get(row)[column];
  }
}

... somewhere else ...
ArrayListModel mymodel=new ArrayListModel(somedata);
JTable mytable=new JTable(mymodel);
... etc ...

補足: Java を初めて学習したとき、JTable を作成する「通常の」方法は、デフォルト モデルを使用し、ベクトルのベクトルまたは 2 次元配列を作成してからデータを入力することだと考えていました。独自のモデルを作成することは、まれな、奇妙なケースで行うものだと思いました。しかし、デフォルトのモデルはまれで単純な場合にのみ最適な方法であることがわかりました。今では、ほとんどの場合、独自のモデルを作成しています。通常は、コード化も理解も容易です。通常、特定のフィールドで作成したクラスの ArrayList があり、モデル クラスには次のようなものがあります。

 public Object getValueAt(int row, int col)
 {
   Whatever w=list.get(row);
   if (col==0) return w.foo;
   else if (col==1) return w.bar;
   else if (col==2) return w.plugh;
   else throw SomeException();
 }

または、case ステートメントを使用します。同じ考えです。

于 2012-11-07T17:48:38.490 に答える