Swing/EditColumnName のバックアップ(No.6)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/EditColumnName へ行く。
- title: JTableのColumn名を変更する tags: [JTable, JTableHeader, TableColumn, DefaultTableModel, JPopupMenu] author: aterai pubdate: 2013-09-23T05:04:22+09:00 description: JTableのColumn名をJPopupMenuを使用して変更します。
概要
JTable
のColumn
名をJPopupMenu
を使用して変更します。
Screenshot
Advertisement
サンプルコード
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); //XXX
model.setColumnIdentifiers(columnNames);
}
}
}
});