Swing/DateCellEditor のバックアップの現在との差分(No.2)
TITLE:CellEditorをJSpinnerにして日付を変更
Posted by terai at 2008-09-22
CellEditorをJSpinnerにして日付を変更
JTableで、日付を表示する列のセルエディタをJSpinnerにします。- 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
にします。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spandel
class SpinnerCellEditor extends AbstractCellEditor implements TableCellEditor {
#spanend
private final JSpinner spinner = new JSpinner(new SpinnerDateModel());
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
class SpinnerCellEditor extends JSpinner implements TableCellEditor {
#spanend
private final JSpinner.DateEditor editor;
public SpinnerCellEditor() {
editor = new JSpinner.DateEditor(spinner, "yyyy/MM/dd");
spinner.setEditor(editor);
super(new SpinnerDateModel());
setEditor(editor = new JSpinner.DateEditor(this, "yyyy/MM/dd"));
setArrowButtonEnabled(false);
spinner.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
//System.out.println("spinner");
editor.getTextField().setHorizontalAlignment(JFormattedTextField.LEFT);
#spanadd
#spanend
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) {
@Override public void focusLost(FocusEvent e) {
setArrowButtonEnabled(false);
}
//@Override
public void focusGained(FocusEvent e) {
//System.out.println("getTextField");
#spanadd
#spanend
@Override public void focusGained(FocusEvent e) {
// System.out.println("getTextField");
setArrowButtonEnabled(true);
EventQueue.invokeLater(new Runnable() {
public void run() {
@Override public void run() {
editor.getTextField().setCaretPosition(8);
editor.getTextField().setSelectionStart(8);
editor.getTextField().setSelectionEnd(10);
}
});
}
});
spinner.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
}
#spanadd
#spanend
private void setArrowButtonEnabled(boolean flag) {
for(Component c: spinner.getComponents()) {
if(c instanceof JButton) {
((JButton)c).setEnabled(flag);
for (Component c : 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;
#spanadd
#spanend
@Override public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
setValue(value);
return this;
}
public Object getCellEditorValue() {
return spinner.getValue();
#spanadd
#spanend
@Override public Object getCellEditorValue() {
return getValue();
}
public boolean isCellEditable(EventObject e) {
if(e instanceof MouseEvent) {
return ((MouseEvent)e).getClickCount() >= 2;
#spanadd
#spanend
// Copied from AbstractCellEditor
// protected EventListenerList listenerList = new EventListenerList();
transient protected ChangeEvent changeEvent = null;
#spanadd
#spanend
@Override public boolean stopCellEditing() {
try {
commitEdit();
} catch (Exception pe) {
Toolkit.getDefaultToolkit().beep();
return false;
}
fireEditingStopped();
return true;
}
#spandel
}
#spanend
// ...
解説
TableModel#getColumnClass(int)で、第2列目が日付(Date.class)を返すように設定し、JTable#setDefaultEditor(Class,CellEditor)メソッドで上記のセルエディタイを関連付けています。解説
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)から値が変更されるようにするため
- 編集開始時、スピナエディタにフォーカスが無い場合は、スピナボタンはクリック不可
- 編集開始と同時に、スピナボタンが押されて日付が変更されるのを防止するため
- 日付用のセルエディタ(
SpinnerCellEditor
):-
SpinnerEditor
で左寄せ- デフォルトのセルレンダラーと合わせるため
-
1.6.0_07
,1.6.0_06
,1.5.0_16
などで、JSpinner
(WindowsLookAndFeel
)の文字サイズ、余白が微妙に異なる?
- ダブルクリックで編集開始
- 編集開始時のキャレットは先頭の「年(
yyyy
)」ではなく「日(dd
)」上にあり、この「日(dd
)」が選択状態になるよう設定- 編集開始直後にUp、Downキーで「日(
dd
)」の値を変更可能にするために必要
- 編集開始直後にUp、Downキーで「日(
- 編集開始時、スピナエディタにフォーカスが無い場合は、スピナボタンはクリック不可に設定
- 編集開始と同時に、スピナボタンが押されて日付が変更されるのを防止するため
-