Swing/DateCellEditor のバックアップ(No.16)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DateCellEditor へ行く。
- 1 (2008-09-22 (月) 13:48:58)
- 2 (2010-03-08 (月) 12:34:49)
- 3 (2010-03-08 (月) 13:45:35)
- 4 (2011-03-11 (金) 03:04:16)
- 5 (2013-01-17 (木) 15:16:35)
- 6 (2013-02-02 (土) 23:01:23)
- 7 (2013-05-30 (木) 19:56:25)
- 8 (2013-07-22 (月) 20:33:44)
- 9 (2013-07-26 (金) 01:52:55)
- 10 (2013-07-27 (土) 00:57:15)
- 11 (2013-08-20 (火) 14:21:19)
- 12 (2014-06-26 (木) 16:17:29)
- 13 (2014-11-01 (土) 00:24:53)
- 14 (2015-11-21 (土) 02:44:47)
- 15 (2017-05-25 (木) 13:57:02)
- 16 (2018-01-05 (金) 21:00:36)
- 17 (2019-05-22 (水) 19:35:38)
- 18 (2019-12-27 (金) 17:44:01)
- 19 (2021-07-02 (金) 17:59:51)
- category: swing folder: DateCellEditor title: CellEditorをJSpinnerにして日付を変更 tags: [JTable, TableCellEditor, JSpinner, Focus, ChangeListener] author: aterai pubdate: 2008-09-22T13:48:58+09:00 description: JTableで、日付を表示する列のセルエディタをJSpinnerにします。 image:
概要
JTable
で、日付を表示する列のセルエディタをJSpinner
にします。
Screenshot
Advertisement
サンプルコード
class SpinnerCellEditor extends JSpinner implements TableCellEditor {
private final JSpinner.DateEditor editor;
public SpinnerCellEditor() {
super(new SpinnerDateModel());
setEditor(editor = new JSpinner.DateEditor(this, "yyyy/MM/dd"));
setArrowButtonEnabled(false);
editor.getTextField().setHorizontalAlignment(JFormattedTextField.LEFT);
addFocusListener(new FocusAdapter() {
@Override public void focusGained(FocusEvent e) {
//System.out.println("spinner");
editor.getTextField().requestFocusInWindow();
}
});
editor.getTextField().addFocusListener(new FocusAdapter() {
@Override public void focusLost(FocusEvent e) {
setArrowButtonEnabled(false);
}
@Override public void focusGained(FocusEvent e) {
//System.out.println("getTextField");
setArrowButtonEnabled(true);
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
editor.getTextField().setCaretPosition(8);
editor.getTextField().setSelectionStart(8);
editor.getTextField().setSelectionEnd(10);
}
});
}
});
setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
}
private void setArrowButtonEnabled(boolean flag) {
for (Component c : getComponents()) {
if (c instanceof JButton) {
((JButton) c).setEnabled(flag);
}
}
}
@Override public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
setValue(value);
return this;
}
@Override public Object getCellEditorValue() {
return getValue();
}
//Copied from AbstractCellEditor
//protected EventListenerList listenerList = new EventListenerList();
transient protected ChangeEvent changeEvent = null;
@Override public boolean stopCellEditing() {
try {
commitEdit();
} catch (Exception pe) {
Toolkit.getDefaultToolkit().beep();
return false;
}
fireEditingStopped();
return true;
}
//...
View in GitHub: Java, Kotlin解説
TableModel#getColumnClass(int)
で、第2
列目が日付(Date.class
)を返すように設定し、JTable#setDefaultEditor(Class,CellEditor)
メソッドで上記のセルエディタを関連付けています。
table.setDefaultEditor(Date.class, new SpinnerCellEditor());
table.setSurrendersFocusOnKeystroke(true);
この日付用のセルエディタ(SpinnerCellEditor
)は、以下のような動作になっています。
- スピナエディタで左寄せ
- デフォルトのセルレンダラーと合わせるため
1.6.0_07
,1.6.0_06
,1.5.0_16
などで、JSpinner
(WindowsLookAndFeel
)の文字サイズ、余白が微妙に異なる?
- ダブルクリックで編集開始
- 編集開始時のキャレットは先頭の年(
yyyy
)ではなく日(dd
)で、日(dd
)が選択状態になる- スピナボタン、UpDownキーなどで、日(
dd
)から値が変更されるようにするため
- スピナボタン、UpDownキーなどで、日(
- 編集開始時、スピナエディタにフォーカスが無い場合は、スピナボタンはクリック不可に設定
- 編集開始と同時に、スピナボタンが押されて日付が変更されるのを防止するため