Swing/EditableComboCellEditor のバックアップ(No.10)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/EditableComboCellEditor へ行く。
- 1 (2016-08-23 (火) 18:03:35)
- 2 (2016-08-26 (金) 15:46:54)
- 3 (2016-09-27 (火) 15:23:14)
- 4 (2017-11-05 (日) 20:48:33)
- 5 (2018-02-24 (土) 19:51:30)
- 6 (2018-04-12 (木) 14:14:31)
- 7 (2018-10-20 (土) 19:06:54)
- 8 (2020-10-23 (金) 17:52:55)
- 9 (2022-07-22 (金) 11:51:11)
- 10 (2025-01-03 (金) 08:57:02)
- 11 (2025-01-03 (金) 09:01:23)
- 12 (2025-01-03 (金) 09:02:38)
- 13 (2025-01-03 (金) 09:03:21)
- 14 (2025-01-03 (金) 09:04:02)
- category: swing
folder: EditableComboCellEditor
title: JTableのセルエディタとして編集追加可能なJComboBoxを使用する
tags: [JTable, TableCellEditor, JComboBox, DefaultComboBoxModel]
author: aterai
pubdate: 2016-07-25T00:38:48+09:00
description: JTableのセルエディタとして編集可能なJComboBoxを適用し、セルの値の追加などを行います。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2016/08/use-editable-jcombobox-as.html lang: en
概要
JTable
のセルエディタとして編集可能なJComboBox
を適用し、セルの値の追加などを行います。
Screenshot

Advertisement
サンプルコード
class ComboCellEditor extends AbstractCellEditor implements TableCellEditor {
private final JComboBox<String> combo = new JComboBox<>();
protected ComboCellEditor() {
super();
combo.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
combo.setEditable(true);
combo.addActionListener(e -> fireEditingStopped());
}
@Override public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column) {
if (value instanceof ComboBoxModel) {
@SuppressWarnings("unchecked")
ComboBoxModel<String> m = (ComboBoxModel<String>) value;
combo.setModel(m);
}
return combo;
}
@Override public Object getCellEditorValue() {
DefaultComboBoxModel<String> m = (DefaultComboBoxModel<String>) combo.getModel();
if (combo.isEditable()) {
String str = Objects.toString(combo.getEditor().getItem(), "");
if (!str.isEmpty() && m.getIndexOf(str) < 0) {
m.insertElementAt(str, 0);
combo.setSelectedIndex(0);
}
}
return m;
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JComboBox#setEditable(true)
で編集可能にしたJComboBox
をJTable
のセルエディタに設定し、セルの値の追加・編集を可能にしています。
- 各行で
JComboBox
の所有するアイテムが異なりまたそれらのアイテムの選択位置も保持する必要があるためTableModel
にはDefaultComboBoxModel
をモデルデータとして保存- JTableのCellEditorにJComboBoxを設定で使用しているデフォルトの
ComboBoxCellEditor
は使用できない
- JTableのCellEditorにJComboBoxを設定で使用しているデフォルトの
JComboBox
をJTable
のセルエディタとして使用する場合、combo.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
を設定する- この設定はドロップダウンリストでカーソルキーによる選択変更しても
ActionEvent
などが発生して編集中止にしないために必要
- この設定はドロップダウンリストでカーソルキーによる選択変更しても