• 追加された行はこの色です。
  • 削除された行はこの色です。
---
category: swing
folder: EditColumnName
title: JTableのColumn名を変更する
tags: [JTable, JTableHeader, TableColumn, DefaultTableModel, JPopupMenu]
author: aterai
pubdate: 2013-09-23T05:04:22+09:00
description: JTableのColumn名をJPopupMenuを使用して変更します。
image: https://lh4.googleusercontent.com/-axnByzuSfvw/Uj9Bj3mhK0I/AAAAAAAAB2U/GgzDuKdOje8/s800/EditColumnName.png
---
* 概要 [#summary]
`JTable`の`Column`名を`JPopupMenu`を使用して変更します。

#download(https://lh4.googleusercontent.com/-axnByzuSfvw/Uj9Bj3mhK0I/AAAAAAAAB2U/GgzDuKdOje8/s800/EditColumnName.png)

* サンプルコード [#sourcecode]
#code(link){{
private final JMenuItem editItem1 = new JMenuItem(
    new AbstractAction("Edit: setHeaderValue") {
  @Override public void actionPerformed(ActionEvent e) {
    JTableHeader header = (JTableHeader) getInvoker();
    TableColumn column = header.getColumnModel().getColumn(index);
    String name = column.getHeaderValue().toString();
    textField.setText(name);
    int result = JOptionPane.showConfirmDialog(
        header.getTable(), textField, getValue(NAME).toString(),
        JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
    if (result == JOptionPane.OK_OPTION) {
      String str = textField.getText().trim();
      if (!str.equals(name)) {
        column.setHeaderValue(str);
        header.repaint(header.getHeaderRect(index));
      }
    }
  }
});
}}

* 解説 [#explanation]
- `Edit: setHeaderValue`
-- `TableColumn#getHeaderValue()`でカラム名を取得して、`TableColumn#setHeaderValue(String)`で変更
-- カラムモデルの`ColumnIdentifier`は、変更されない
- `Edit: setColumnIdentifiers`
-- `DefaultTableModel#setColumnIdentifiers(Object[])`でモデルの列識別子を置き換え、`JTableHeader`を作り直しているため、列の入れ替えなどは初期化される
-- ドラッグ中のカラムが存在する状態で、`DefaultTableModel#setColumnIdentifiers(Object[])`を実行すると、`ArrayIndexOutOfBoundsException: -1`が発生する
--- このサンプルでは、`JTableHeader#setDraggedColumn(null);`で、ドラッグ中のカラムをクリアしている
--- `DefaultTableModel#setColumnIdentifiers(Object[])`を使用する場合は、`table.getTableHeader().setReorderingAllowed(false);`とドラッグによる列の順序変更を禁止しておいた方が良いかもしれない

--- `DefaultTableModel#setColumnIdentifiers(Object[])`を使用する場合は、`table.getTableHeader().setReorderingAllowed(false);`でドラッグによる列の順序変更を禁止しておいた方が良さそう
#code{{
private final JMenuItem editItem2 = new JMenuItem(
        new AbstractAction("Edit: setColumnIdentifiers") {
  @Override public void actionPerformed(ActionEvent e) {
    final JTableHeader header = (JTableHeader) getInvoker();
    final JTable table = header.getTable();
    final DefaultTableModel model = (DefaultTableModel) table.getModel();
    String name = table.getColumnName(index);
    textField.setText(name);
    int result = JOptionPane.showConfirmDialog(
        table, textField, getValue(NAME).toString(),
        JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
    if (result == JOptionPane.OK_OPTION) {
      String str = textField.getText().trim();
      if (!str.equals(name)) {
        columnNames[table.convertColumnIndexToModel(index)] = str;
        header.setDraggedColumn(null); //clear column dragging
        model.setColumnIdentifiers(columnNames);
      }
    }
  }
});
}}

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/table/TableColumn.html#setHeaderValue-java.lang.Object- TableColumn#setHeaderValue(Object) (Java Platform SE 8)]
- [[JTableHeaderにJPopupMenuを追加してソート>Swing/RowSorterPopupMenu]]

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