Swing/DateCellEditor のバックアップ差分(No.6)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - 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にして日付を変更 #navi(../) #tags() #tags(JTable, TableCellEditor, JSpinner, Focus, ChangeListener) RIGHT:Posted by &author(aterai); at 2008-09-22 *CellEditorをJSpinnerにして日付を変更 [#e0a555cb] JTableで、日付を表示する列のセルエディタをJSpinnerにします。 ``JTable``で、日付を表示する列のセルエディタを``JSpinner``にします。 -&jnlp; -&jar; -&zip; //#screenshot #ref(http://lh5.ggpht.com/_9Z4BYR88imo/TQTKdTsjXPI/AAAAAAAAAWA/vtjdEFUkZA4/s800/DateCellEditor.png) **サンプルコード [#t0d2e8ee] #code(link){{ //class SpinnerCellEditor extends AbstractCellEditor implements TableCellEditor { class SpinnerCellEditor extends JSpinner implements TableCellEditor { private final JSpinner.DateEditor editor; public SpinnerCellEditor(final JTable table) { super(new SpinnerDateModel()); setEditor(editor = new JSpinner.DateEditor(this, "yyyy/MM/dd")); setArrowButtonEnabled(false); addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { EventQueue.invokeLater(new Runnable() { @Override public void run() { int row = table.convertRowIndexToModel(table.getEditingRow()); table.getModel().setValueAt(getValue(), row, 2); } }); } }); 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) { editor.getTextField().setHorizontalAlignment(JFormattedTextField.LEFT); setValue(value); return this; } @Override public Object getCellEditorValue() { return getValue(); } //Copid from AbstractCellEditor //protected EventListenerList listenerList = new EventListenerList(); transient protected ChangeEvent changeEvent = null; //...... }} **解説 [#s39b6483] TableModel#getColumnClass(int)で、第2列目が日付(Date.class)を返すように設定し、JTable#setDefaultEditor(Class,CellEditor)メソッドで上記のセルエディタイを関連付けています。 ``TableModel#getColumnClass(int)``で、第``2``列目が日付(``Date.class``)を返すように設定し、``JTable#setDefaultEditor(Class,CellEditor)``メソッドで上記のセルエディタイを関連付けています。 #code{{ table.setDefaultEditor(Date.class, new SpinnerCellEditor()); table.setSurrendersFocusOnKeystroke(true); }} この日付用のセルエディタ(SpinnerCellEditor)は、以下のような動作になっています。 この日付用のセルエディタ(``SpinnerCellEditor``)は、以下のような動作になっています。 -スピナエディタで左寄せ --デフォルトのセルレンダラーと合わせるため --1.6.0_07, 1.6.0_06, 1.5.0_16などで、JSpinner(WindowsL&F)の文字サイズ、余白が微妙に異なる? --``1.6.0_07``, ``1.6.0_06``, ``1.5.0_16``などで、``JSpinner``(``WindowsLookAndFeel``)の文字サイズ、余白が微妙に異なる? -ダブルクリックで編集開始 -編集開始時のキャレットは先頭の年(yyyy)ではなく日(dd)で、日(dd)が選択状態になる --スピナボタン、上下キーなどで、日(dd)から値が変更されるようにするため -編集開始時のキャレットは先頭の年(``yyyy``)ではなく日(``dd``)で、日(``dd``)が選択状態になる --スピナボタン、上下キーなどで、日(``dd``)から値が変更されるようにするため -編集開始時、スピナエディタにフォーカスが無い場合は、スピナボタンはクリック不可 --編集開始と同時に、スピナボタンが押されて日付が変更されるのを防止するため //**参考リンク **コメント [#t15c7e2c] #comment