Swing/ClearTable のバックアップの現在との差分(No.9)
TITLE:JTableの行を全削除
Posted by terai at 2005-04-11
JTableの行を全削除
JTableの行を一括で全削除します。- category: swing folder: ClearTable title: JTableの行を全削除 tags: [JTable, DefaultTableModel] author: aterai pubdate: 2005-04-11T02:13:34+09:00 description: JTableのモデルから、カラムヘッダの状態は変更せず、すべての行を一括で削除します。 image:
概要
JTable
のモデルから、カラムヘッダの状態は変更せず、すべての行を一括で削除します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spandel
final DefaultTableModel model = new DefaultTableModel();
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
button.addActionListener(new AbstractAction("clear") {
public void actionPerformed(ActionEvent e) {
@Override public void actionPerformed(ActionEvent e) {
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setRowCount(0);
}
});
解説
モデルがDefaultTableModelを継承しているなら、setRowCount(0)ですべての行を削除することができます。この場合、モデルを作り直している訳ではないので、カラムの幅などは削除する前と同じ値を保っています。解説
-
TableModel
がDefaultTableModel
を継承している場合、model.setRowCount(0)
ですべての行が削除可能 - 空の
TableModel
をJTable
に設定すれば行の全削除を行うことが可能だが、ヘッダモデルの再作成が発生しカラム幅や順番などが初期化されてしまう-
JTable#setAutoCreateColumnsFromModel(false)
とカラムをモデルから自動生成しないようにしておけばTableModel
を入れ替えても列幅などは保存される#spanend #spanadd table.setAutoCreateColumnsFromModel(false); #spanend #spanadd table.setModel(new DefaultTableModel()); #spanend #spanadd
-
- -
-
DefaultTableModel
を継承していない場合は、モデルに以下の要領(詳細はDefaultTableModel.java
のソースを参照)で行を全削除するメソッドを実装する必要があるpublic void clear() { //以下のdataVectorは実装に合わせて変更してください // 以下のdataVectorは実装に合わせて変更する int size = dataVector.size(); dataVector.clear(); fireTableRowsDeleted(0, size-1); //fireTableDataChanged(); fireTableRowsDeleted(0, size - 1); // fireTableDataChanged(); }
- - JTable#setAutoCreateColumnsFromModel(false)としておけば、TableModelを入れ替えても、上記の方法と同じように既存の列はクリアされません。
参考リンク
- JTableの行を追加、削除
- JTableのセルにJButtonを追加して行削除
- JDK-8032874 ArrayIndexOutOfBoundsException in JTable while clearing data in JTable - Java Bug System
- コメントの
ArrayIndexOutOfBoundsException
と似ている?JDK-8032874
の件は修正済み
- コメントの
#spanend
#spandel
//((DefaultTableModel)table.getModel()).setRowCount(0);
#spanend
#spandel
table.setAutoCreateColumnsFromModel(false);
#spanend
#spandel
table.setModel(new DefaultTableModel());
#spanend
#spandel
コメント
- ソートした状態で「
remove all rows
」を押すと例外が発生しますよ -- tohrisugari- ご指摘ありがとうございます。確かに
ArrayIndexOutOfBoundsException: 0 >= 0
が発生していますね。以前は正常だったはず?と思って調べてみたら、Bug ID: JDK-6967479 JTable sorter fires even if the model is emptyが原因?で、6u10,6u20
以降で発生しているようです。8
で修正される予定?らしいので、しばらくは別の方法を使用するように修正し何時修正されるか分からないので回避方法を考えてみようと思います。-- aterai -
Bug ID: JDK-6967479 JTable sorter fires even if the model is emptyにあるようにmodel.setRowCount(0);
の前に、table.setRowSorter(null);
とソートを不可にする修正などを追加しました。DefaultTableModel#getColumnClass
をオーバーライドする方法が簡単なので、そのように修正しました。 -- aterai
- ご指摘ありがとうございます。確かに
- Javaのバグだったのですね。ちなみに私は
DefaultTableModel#getColumnClass
のオーバーライドでは解決しなかったので、table.setRowSorter(null)
の対応案を参考にさせていただきました。 -- tohrisugari- 行の追加削除があるサンプルなのに、
model
が空の場合でもTableModel#getValueAt(0, column).getClass()
を呼ぶようなが呼ばれる可能性がある手抜きをしているのが悪いので、Java
のバグというのはかわいそうな気も(面倒なので可能なら修正して欲しいですが)します(^^;。 -- aterai
- 行の追加削除があるサンプルなのに、