Swing/EditableComboCellEditor のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/EditableComboCellEditor へ行く。
- 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:
概要
JTable
のセルエディタとして編集可能なJComboBox
を適用し、セルの値の追加などを行います。
Screenshot
Advertisement
サンプルコード
class ComboCellEditor extends AbstractCellEditor implements TableCellEditor {
private final JComboBox<String> combo = new JComboBox<>();
protected ComboCellEditor() {
super();
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() {
@SuppressWarnings("unchecked")
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解説
上記のサンプルでは、setEditable(true);
としたJComboBox
をJTable
のセルエディタに設定し、セルの値を追加したり編集したりすることを可能にしています。JTableのCellEditorにJComboBoxを設定で使用しているデフォルトのComboBoxCellEditor
とは違い、各行でJComboBox
の所有するアイテムが異なり、またそれらのアイテムの選択位置も保持する必要があるため、TableModel
にはDefaultComboBoxModel
をモデルデータとして保存しています。