TITLE:JTableのColumn名を変更する

Posted by at 2013-09-23

JTableのColumn名を変更する

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

  • &jnlp;
  • &jar;
  • &zip;
EditColumnName.png

サンプルコード

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

解説

  • `Edit: setHeaderValue`
    • `TableColumn#getHeaderValue()でカラム名を取得して、TableColumn#setHeaderValue(String)`で変更
  • `Edit: setColumnIdentifiers`
    • `DefaultTableModel#setColumnIdentifiers(Object[])でモデルの列識別子を置き換え、JTableHeader`を作り直し
      • このため、列の入れ替えなどは初期化される
    • ドラッグ中のカラムが存在する状態で、`DefaultTableModel#setColumnIdentifiers(Object[])を実行すると、ArrayIndexOutOfBoundsException: -1`が発生する
      • `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); //XXX
        model.setColumnIdentifiers(columnNames);
      }
    }
  }
});

参考リンク

コメント