Swing/DateCellEditor のバックアップ(No.10)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- 20 (2025-01-03 (金) 08:57:02)
- 21 (2025-01-03 (金) 09:01:23)
- 22 (2025-01-03 (金) 09:02:38)
- 23 (2025-01-03 (金) 09:03:21)
- 24 (2025-01-03 (金) 09:04:02)
- 25 (2025-06-19 (木) 12:41:37)
- 26 (2025-06-19 (木) 12:43:47)
TITLE:CellEditorをJSpinnerにして日付を変更
Posted by aterai at 2008-09-22
CellEditorをJSpinnerにして日付を変更
`JTable
で、日付を表示する列のセルエディタを
JSpinner
`にします。
- &jnlp;
- &jar;
- &zip;
サンプルコード
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();
}
//Copid 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
`)が選択状態になる- スピナボタン、上下キーなどで、日(`
dd
`)から値が変更されるようにするため
- スピナボタン、上下キーなどで、日(`
- 編集開始時、スピナエディタにフォーカスが無い場合は、スピナボタンはクリック不可
- 編集開始と同時に、スピナボタンが押されて日付が変更されるのを防止するため
参考リンク
コメント
- `
JTextField
を直接編集して、TABキーなどで編集終了すると
ArrayIndexOutOfBoundsException
`が発生するバグを修正。 -- aterai