TITLE:JTableの行を全削除

Posted by at 2005-04-11

JTableの行を全削除

JTableの行を一括で全削除します。

ClearTable.png

サンプルコード

button.addActionListener(new AbstractAction("clear") {
  @Override public void actionPerformed(ActionEvent e) {
    DefaultTableModel model = (DefaultTableModel)table.getModel();
    model.setRowCount(0);
  }
});
View in GitHub: Java, Kotlin

解説

モデルがDefaultTableModelを継承しているなら、setRowCount(0)ですべての行を削除することができます。この場合、モデルを作り直している訳ではないので、カラムの幅などは削除する前と同じ値を保っています。

DefaultTableModelを継承していない場合は、モデルに以下の要領(詳細はDefaultTableModel.javaのソースを参照)で行を全削除するメソッドを実装します。

public void clear() {
  //以下のdataVectorは実装に合わせて変更する
  int size = dataVector.size();
  dataVector.clear();
  fireTableRowsDeleted(0, size-1);
  //fireTableDataChanged();
}

JTable#setAutoCreateColumnsFromModel(false)とカラムをモデルから自動生成しないようにしておけば、TableModelを入れ替えても、上記の方法と同様に既存の列幅などはそのまま残ります。

table.setAutoCreateColumnsFromModel(false);
table.setModel(new DefaultTableModel());

参考リンク

コメント

  • ソートした状態で「remove all rows」を押すと例外が発生しますよ -- tohrisugari
    • ご指摘ありがとうございます。確かにArrayIndexOutOfBoundsException: 0 >= 0が発生していますね。以前は正常だったはず?と思って調べてみたら、Bug ID: JDK-6967479 JTable sorter fires even if the model is emptyが原因?で、6u10,6u20以降で発生しているようです。 8で修正される予定?みたいなので、しばらくは別の方法を使用するように修正し 何時修正されるか分からないので回避方法を考えてみようと思います。 -- aterai
    • model.setRowCount(0);の前に、table.setRowSorter(null);とソートを不可にする修正などを追加しました。 Bug ID: JDK-6967479 JTable sorter fires even if the model is emptyにあるようにDefaultTableModel#getColumnClassをオーバーライドする方法が簡単なので、そのように修正しました。 -- aterai
  • Javaのバグだったのですね。ちなみに私はDefaultTableModel#getColumnClassのオーバライドでは解決しなかったので、table.setRowSorter(null)の対応案を参考にさせていただきました。 -- tohrisugari
    • 行の追加削除があるサンプルなのに、modelが空の場合でもTableModel#getValueAt(0, column).getClass() を呼ぶような が呼ばれる可能性がある手抜きをしているのが悪いので、Javaのバグというのはかわいそうな気も(面倒なので出来れば修正して欲しいですが)します(^^;。 -- aterai