Swing/NoArrowButtonComboCellEditor のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/NoArrowButtonComboCellEditor へ行く。
- 1 (2017-04-07 (金) 13:57:10)
- 2 (2018-03-23 (金) 16:30:32)
- 3 (2020-03-27 (金) 14:41:18)
- 4 (2021-10-02 (土) 21:14:14)
- 5 (2022-10-14 (金) 19:29:38)
- category: swing folder: NoArrowButtonComboCellEditor title: JTableのCellEditorにArrowButtonを非表示にしたJComboBoxを設定 tags: [JTable, CellEditor, JComboBox, ArrowButton, LocalDateTime] author: aterai pubdate: 2015-08-17T01:24:54+09:00 description: JTableのCellEditorとしてArrowButtonを非表示にしたJComboBoxを使用します。 image:
概要
JTable
のCellEditor
としてArrowButton
を非表示にしたJComboBox
を使用します。
Screenshot
Advertisement
サンプルコード
class LocalDateTimeTableCellEditor extends AbstractCellEditor
implements TableCellEditor {
private final JComboBox<LocalDateTime> comboBox;
private LocalDateTime selectedDate;
public LocalDateTimeTableCellEditor() {
super();
UIManager.put("ComboBox.squareButton", Boolean.FALSE);
comboBox = new JComboBox<LocalDateTime>() {
@Override public void updateUI() {
super.updateUI();
setBorder(BorderFactory.createEmptyBorder());
setOpaque(true);
setRenderer(new LocalDateTimeCellRenderer<LocalDateTime>());
setUI(new BasicComboBoxUI() {
@Override protected JButton createArrowButton() {
JButton button = new JButton(); //.createArrowButton();
button.setBorder(BorderFactory.createEmptyBorder());
button.setVisible(false);
return button;
}
});
}
};
comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
}
@Override public Component getTableCellEditorComponent(
JTable table, final Object value, boolean isSelected, int row, int column) {
if (value instanceof LocalDateTime) {
comboBox.setModel(new DefaultComboBoxModel<LocalDateTime>() {
@Override public LocalDateTime getElementAt(int index) {
if (index >= 0 && index < getSize()) {
return LocalDateTime.now().plusDays(index);
} else {
return LocalDateTime.now();
}
}
@Override public int getSize() {
return 7;
}
@Override public Object getSelectedItem() {
return selectedDate;
}
@Override public void setSelectedItem(Object anItem) {
selectedDate = (LocalDateTime) anItem;
}
});
selectedDate = (LocalDateTime) value;
}
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
comboBox.setSelectedItem(value);
}
});
return comboBox;
}
@Override public Object getCellEditorValue() {
return comboBox.getSelectedItem();
}
@Override public boolean shouldSelectCell(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
MouseEvent e = (MouseEvent) anEvent;
return e.getID() != MouseEvent.MOUSE_DRAGGED;
}
return true;
}
@Override public boolean stopCellEditing() {
if (comboBox.isEditable()) {
// Commit edited value.
comboBox.actionPerformed(new ActionEvent(this, 0, ""));
}
return super.stopCellEditing();
}
@Override public boolean isCellEditable(EventObject e) {
return true;
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、ArrowButton
を非表示にしたJComboBox
を使用するTableCellEditor
を作成しています。
- この
JComboBox
で編集する値はLocalDateTime
なので、DefaultCellEditor
は使用しないAbstractCellEditor
を継承するTableCellEditor
を作成
LocalDateTime.now()
で取得した日付から7
日分をJComboBox
で選択可能になるよう、TableCellEditor#getTableCellEditorComponent(...)
内でComboBoxModel
を更新