Swing/DateCellEditor のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
TITLE:CellEditorをJSpinnerにして日付を変更
Posted by terai at 2008-09-22
CellEditorをJSpinnerにして日付を変更
JTableで、日付を表示する列のセルエディタをJSpinnerにします。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
class SpinnerCellEditor extends AbstractCellEditor implements TableCellEditor {
private final JSpinner spinner = new JSpinner(new SpinnerDateModel());
private final JSpinner.DateEditor editor;
public SpinnerCellEditor() {
editor = new JSpinner.DateEditor(spinner, "yyyy/MM/dd");
spinner.setEditor(editor);
setArrowButtonEnabled(false);
spinner.addFocusListener(new FocusAdapter() {
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() {
public void run() {
editor.getTextField().setCaretPosition(8);
editor.getTextField().setSelectionStart(8);
editor.getTextField().setSelectionEnd(10);
}
});
}
});
spinner.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
}
private void setArrowButtonEnabled(boolean flag) {
for(Component c: spinner.getComponents()) {
if(c instanceof JButton) {
((JButton)c).setEnabled(flag);
}
}
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
spinner.setValue(value);
editor.getTextField().setHorizontalAlignment(JFormattedTextField.LEFT);
//JTextField tf = editor.getTextField();
//tf.setCaretPosition(8);
//tf.setSelectionStart(8);
//tf.setSelectionEnd(10);
return spinner;
}
public Object getCellEditorValue() {
return spinner.getValue();
}
public boolean isCellEditable(EventObject e) {
if(e instanceof MouseEvent) {
return ((MouseEvent)e).getClickCount() >= 2;
}
return true;
}
}
解説
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(WindowsL&F)の文字サイズ、余白が微妙に異なる?
- ダブルクリックで編集開始
- 編集開始時のキャレットは先頭の年(yyyy)ではなく日(dd)で、日(dd)が選択状態になる
- スピナボタン、上下キーなどで、日(dd)から値が変更されるようにするため
- 編集開始時、スピナエディタにフォーカスが無い場合は、スピナボタンはクリック不可
- 編集開始と同時に、スピナボタンが押されて日付が変更されるのを防止するため