Swing/NoArrowButtonComboCellEditor の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/NoArrowButtonComboCellEditor へ行く。
- Swing/NoArrowButtonComboCellEditor の差分を削除
--- 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: https://lh3.googleusercontent.com/-rMRAQF0w4iQ/VdC10-8iyjI/AAAAAAAAN_c/5hX5mZ8KFUg/s800-Ic42/NoArrowButtonComboCellEditor.png --- * 概要 [#summary] `JTable`の`CellEditor`として`ArrowButton`を非表示にした`JComboBox`を使用します。 #download(https://lh3.googleusercontent.com/-rMRAQF0w4iQ/VdC10-8iyjI/AAAAAAAAN_c/5hX5mZ8KFUg/s800-Ic42/NoArrowButtonComboCellEditor.png) * サンプルコード [#sourcecode] #code(link){{ 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; } } }} * 解説 [#explanation] - `ArrowButton`を非表示にした`JComboBox`を使用する`TableCellEditor`を作成 - この`JComboBox`で編集する値は`LocalDateTime`なので、`DefaultCellEditor`は使用しない - この`JComboBox`で編集する値は`LocalDateTime`なので`DefaultCellEditor`は使用しない -- `AbstractCellEditor`を継承する`TableCellEditor`を作成 - `LocalDateTime.now()`で取得した日付から`7`日分を`JComboBox`で選択可能になるよう、`TableCellEditor#getTableCellEditorComponent(...)`内で`ComboBoxModel`を更新 * 参考リンク [#reference] - [[JComboBoxのArrowButtonを隠す>Swing/HideComboArrowButton]] - [[JTableのCellEditorにJComboBoxを設定>Swing/ComboCellEditor]] * コメント [#comment] #comment #comment