Swing/EditColumnName の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/EditColumnName へ行く。
- Swing/EditColumnName の差分を削除
--- 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`は変更されない -- このメソッドでカラム名を変更してもカラムモデルの`ColumnIdentifier`は変更されない - `Edit: setColumnIdentifiers` -- `DefaultTableModel#setColumnIdentifiers(Object[])`メソッドでモデルの列識別子を変更 -- `JTableHeader`を再作成することになるため列の入れ替えなどは初期化される -- ドラッグ中のカラムが存在する状態で`DefaultTableModel#setColumnIdentifiers(Object[])`を実行すると`ArrayIndexOutOfBoundsException: -1`が発生する --- このサンプルでは、`JTableHeader#setDraggedColumn(null)`でドラッグ中のカラムをクリアしている --- `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