• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableの行を全削除
#navi(../)
*JTableの行を全削除 [#j3b5fd74]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-04-11~
更新日:&lastmod;
---
category: swing
folder: ClearTable
title: JTableの行を全削除
tags: [JTable, DefaultTableModel]
author: aterai
pubdate: 2005-04-11T02:13:34+09:00
description: JTableのモデルから、カラムヘッダの状態は変更せず、すべての行を一括で削除します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTJISEHcVI/AAAAAAAAAT4/syR1Ucd5n5o/s800/ClearTable.png
---
* 概要 [#summary]
`JTable`のモデルから、カラムヘッダの状態は変更せず、すべての行を一括で削除します。

#contents
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTJISEHcVI/AAAAAAAAAT4/syR1Ucd5n5o/s800/ClearTable.png)

**概要 [#y4a530d2]
JTableの行を一括で全削除します。
* サンプルコード [#sourcecode]
#code(link){{
button.addActionListener(new AbstractAction("clear") {
  @Override public void actionPerformed(ActionEvent e) {
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    model.setRowCount(0);
  }
});
}}

#screenshot

**サンプルコード [#i0d5d0ba]
* 解説 [#explanation]
- `TableModel`が`DefaultTableModel`を継承している場合、`model.setRowCount(0)`ですべての行が削除可能
- 空の`TableModel`を`JTable`に設定すれば行の全削除を行うことが可能だが、ヘッダモデルの再作成が発生しカラム幅や順番などが初期化されてしまう
-- `JTable#setAutoCreateColumnsFromModel(false)`とカラムをモデルから自動生成しないようにしておけば`TableModel`を入れ替えても列幅などは保存される
#code{{
 button.addActionListener(new AbstractAction("全消去") {
   public void actionPerformed(ActionEvent ae) {
     //DefaultTableModel model = (DefaultTableModel)table.getModel();
     //model.clear();
     model.setRowCount(0);
   }
 });
table.setAutoCreateColumnsFromModel(false);
table.setModel(new DefaultTableModel());
}}
-&jnlp;
-&jar;
-&zip;

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

DefaultTableModelを継承していない場合は、モデルに以下の要領((詳細はDefaultTableModel.javaのソースを参照してください。))で行を全削除するメソッドを実装します。
----
- `DefaultTableModel`を継承していない場合は、モデルに以下の要領(詳細は`DefaultTableModel.java`のソースを参照)で行を全削除するメソッドを実装する必要がある
#code{{
 public void clear() {
   //以下のdataVectorは実装に合わせて変更してください
   int size = dataVector.size();
   dataVector.clear();
   fireTableRowsDeleted(0, size-1);
   //fireTableDataChanged();
 }
public void clear() {
  // 以下のdataVectorは実装に合わせて変更する
  int size = dataVector.size();
  dataVector.clear();
  fireTableRowsDeleted(0, size - 1);
  // fireTableDataChanged();
}
}}

**参考リンク [#sa1a2655]
-[[JTableの行を追加、削除>Swing/AddRow]]
* 参考リンク [#reference]
- [[JTableの行を追加、削除>Swing/AddRow]]
- [[JTableのセルにJButtonを追加して行削除>Swing/DeleteButtonInCell]]
- [https://bugs.openjdk.org/browse/JDK-8032874 JDK-8032874 ArrayIndexOutOfBoundsException in JTable while clearing data in JTable - Java Bug System]
-- コメントの`ArrayIndexOutOfBoundsException`と似ている?`JDK-8032874`の件は修正済み

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

#comment