• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableの行を追加、削除
#navi(../)
RIGHT:Posted by [[terai]] at 2004-06-04
*JTableの行を追加、削除 [#o1339781]
JTableで行の追加と削除を行います。
---
category: swing
folder: AddRow
title: JTableの行を追加、削除
tags: [JTable, JPopupMenu]
author: aterai
pubdate: 2004-05-03T19:35:45+09:00
description: JTableへの行追加と、選択行の削除をJPopupMenuから実行します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTHaSWCCMI/AAAAAAAAARI/UM476TJWRdM/s800/AddRow.png
---
* 概要 [#summary]
`JTable`への行追加と、選択行の削除を`JPopupMenu`から実行します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTHaSWCCMI/AAAAAAAAARI/UM476TJWRdM/s800/AddRow.png)

#screenshot

**サンプルコード [#a48c4459]
#code{{
public class TestModel extends DefaultTableModel {
  public void addTest(Test tst) {
    Object[] obj = {Integer.valueOf(number), tst.getName(), tst.getComment()};
    super.addRow(obj);
    number++;
    //fireTableDataChanged();
  }
//......
}}
#code{{
private final TestModel model = new TestModel();
private final TableSorter sorter;
* サンプルコード [#sourcecode]
#code(link){{
private final DefaultTableModel model = new DefaultTableModel();
private final JTable table;
private void testCreateActionPerformed(ActionEvent e) {
  model.addTest(new Test("新規の名前", ""));
  //追加された最終行までスクロール
  Rectangle rect = table.getCellRect(model.getRowCount()-1,0,true);
  table.scrollRectToVisible(rect);
  //table.repaint();

private void createActionPerformed(ActionEvent e) {
  int rc = model.getRowCount();
  model.addRow(new Object[] {rc, "New name", ""});
  // 追加された最終行までスクロール
  table.scrollRectToVisible(table.getCellRect(rc, 0, true));
}
private void deleteActionPerformed(ActionEvent evt) {

private void deleteActionPerformed(ActionEvent e) {
  int[] selection = table.getSelectedRows();
  if(selection==null || selection.length<=0) return;
  for(int i=selection.length-1;i>=0;i--) {
    model.removeRow(sorter.modelIndex(selection[i]));
  for (int i = selection.length - 1; i >= 0; i--) {
    model.removeRow(table.convertRowIndexToModel(selection[i]));
  }
  //table.repaint();
}
//......
}}

**解説 [#y17790fd]
上記のサンプルでは、ポップアップメニューを使って、行の追加と削除を行っています。
* 解説 [#explanation]
上記のサンプルでは、ポップアップメニューを使用して行の追加と削除を行っています。

-追加
-- DefaultTableModelのaddRowメソッドを使用し、オブジェクトの配列を行として追加しています。
-- 追加された行が表示されるように、getCellRectで行の領域を取得し、scrollRectToVisibleでそこまでスクロールさせています。

- 追加
-- `DefaultTableModel`の`addRow`メソッドを使用しオブジェクトの配列を行として追加
-- 追加された行が表示されるように`JTable#getCellRect(...)`で行の領域を取得し`JTable#scrollRectToVisible(...)`でスクロール
- 削除
-- 複数行の削除に対応するために、indexの大きい方からremoveRowメソッドを使用しています。
-- 行のソートを行っている場合は、TableSorterのmodelIndexメソッドを挟む必要があります。
-- 複数行の削除に対応するため`index`の大きい方から削除する
-- 行がソートされている場合を考慮して`JTable#convertRowIndexToModel(int)`メソッドで`viewIndex`を`modelIndex`に変換してから`DefaultTableModel#removeRow(int modelIndex)`を使って削除

行を削除するとき、TableSorterではなく、JDK 6 の TableRowSorter を使用している場合は、JTable#convertRowIndexToModel(int)メソッドを使用して、インデックスからモデルへの変換を行います(参考:[[RowFilterでJTableの行をフィルタリング>Swing/RowFilter]]のsrc.zip)。
#code{{
//model.removeRow(sorter.modelIndex(selection[i]));
model.removeRow(table.convertRowIndexToModel(selection[i]));
}}
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/table/DefaultTableModel.html DefaultTableModel (Java Platform SE 8)]
- [[JTableのセルにJButtonを追加して行削除>Swing/DeleteButtonInCell]]
- [[JTableの行を全削除>Swing/ClearTable]]
- [[JTableで行の追加、削除アニメーション>Swing/SlideTableRows]]

**参考リンク [#ic4670f1]
-[[JTableのセルにJButtonを追加して行削除>Swing/DeleteButtonInCell]]
-[[JTableの行を全削除>Swing/ClearTable]]

**コメント [#nce8b0f0]
* コメント [#comment]
#comment
#comment