• 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

概要

JTableColumn名をJPopupMenuを使用して変更します。

サンプルコード

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));
      }
    }
  }
});
View in GitHub: Java, Kotlin

解説

  • 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);でドラッグによる列の順序変更を禁止しておいた方が良さそう
        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);
              }
            }
          }
        });
        

参考リンク

コメント