Swing/TerminateEdit のバックアップソース(No.6)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/TerminateEdit へ行く。
- 1 (2007-04-16 (月) 16:28:55)
- 2 (2007-04-17 (火) 11:52:32)
- 3 (2007-04-19 (木) 14:07:18)
- 4 (2007-04-20 (金) 13:37:39)
- 5 (2007-04-20 (金) 18:40:13)
- 6 (2007-05-31 (木) 19:51:20)
- 7 (2007-06-01 (金) 17:30:34)
- 8 (2007-10-23 (火) 21:40:58)
- 9 (2008-04-04 (金) 00:35:14)
- 10 (2008-04-04 (金) 14:11:01)
- 11 (2009-09-07 (月) 13:52:10)
- 12 (2010-09-18 (土) 10:37:50)
- 13 (2011-03-16 (水) 20:01:39)
- 14 (2011-11-01 (火) 18:36:05)
- 15 (2012-02-23 (木) 03:58:34)
- 16 (2012-02-23 (木) 14:48:57)
- 17 (2012-06-26 (火) 20:36:21)
- 18 (2013-02-09 (土) 23:51:53)
- 19 (2013-07-26 (金) 01:56:34)
- 20 (2013-08-20 (火) 14:26:43)
- 21 (2014-11-01 (土) 00:46:09)
- 22 (2014-12-18 (木) 17:08:05)
- 23 (2016-03-18 (金) 15:08:10)
- 24 (2016-09-02 (金) 12:33:23)
- 25 (2016-09-28 (水) 17:10:24)
- 26 (2017-11-02 (木) 15:34:40)
- 27 (2017-11-08 (水) 13:54:11)
- 28 (2019-06-26 (水) 22:03:19)
- 29 (2021-03-02 (火) 14:35:54)
- 30 (2022-08-20 (土) 22:15:25)
- 31 (2022-10-01 (土) 04:56:39)
TITLE:JTableのセルの編集をコミット #navi(../) *JTableのセルの編集をコミット [#bb49aeec] >編集者:[[Terai Atsuhiro>terai]]~ 作成日:2007-04-16~ 更新日:&lastmod; #contents **概要 [#e5533a8a] セルの編集中、フォーカスが別のコンポーネントに移動した場合、その編集を確定する方法をテストします。 #screenshot **サンプルコード [#lc14b0a2] #code{{ table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); DefaultCellEditor dce = (DefaultCellEditor)table.getDefaultEditor(Object.class); dce.getComponent().addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { if(!focusCheck.isSelected()) return; if(table.isEditing()) { table.getCellEditor().stopCellEditing(); } } }); table.getTableHeader().addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if(!headerCheck.isSelected()) return; if(table.isEditing()) { table.getCellEditor().stopCellEditing(); } } }); }} -&jnlp; -&jar; -&zip; **解説 [#rf7adb29] デフォルトのJTableでは、タブキーやマウスのクリックなどで同じテーブルの別セルにフォーカスが移動すると編集が確定しますが、別のコンポーネントにフォーカスが移動しても編集は確定しません。 -table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);とすると、 --同じフレームを親に持つコンポーネントにフォーカスが移動したとき、編集が確定するようになります。 --別フレームのコンポーネントにフォーカスが移動しても編集中のままです。 --ヘッダをクリック、入れ替え、サイズ変更すると、編集はキャンセルされます。 -DefaultCellEditorからエディタコンポーネントを取得し、FocusListenerを設定して、セルが編集中ならtable.getCellEditor().stopCellEditing();とすると、 --別フレームのコンポーネントにフォーカスが移動したときも、編集が確定するようになります。 --ヘッダをクリック、入れ替え、サイズ変更すると、編集はキャンセルされます。 -TableHeaderにMouseListenerを設定して、セルが編集中ならtable.getCellEditor().stopCellEditing();とすると、 --ヘッダをクリックしたとき、編集が確定するようになります。 ---- 親フレームの状態変化でテーブルのヘッダのサイズ変更が発生する場合、ヘッダのリサイズモデルによって、編集中のセルの状態変化が異なります。 -JTable.AUTO_RESIZE_OFF --親フレームのリサイズや最大化は編集中のまま -JTable.AUTO_RESIZE_ALL_COLUMNSなど --親フレームのリサイズや最大化を行うとヘッダのサイズが変化するため、キャンセル扱い ヘッダのサイズが変化しない場合は、どちらの設定でも以下のようになります。 -親フレームの最小化(アイコン化)は編集中のまま -親フレームを閉じる場合はキャンセル扱い 親フレームの状態変化に応じて編集の確定を行う場合は、以下のように、JTable#columnMarginChangedメソッドなどをオーバーライドしたり、各種リスナーを設定する必要があります。 #code{{ table = new JTable(sorter) { public void columnMarginChanged(ChangeEvent e) { if(table.isEditing()) { table.getCellEditor().stopCellEditing(); } super.columnMarginChanged(e); } }; frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if(table.isEditing()) { table.getCellEditor().stopCellEditing(); } } }); frame.addWindowStateListener(new WindowStateListener() { public void windowStateChanged(WindowEvent e) { if(frame.getExtendedState()==JFrame.MAXIMIZED_BOTH && table.isEditing()) { table.getCellEditor().stopCellEditing(); } } }); }} //**参考リンク **コメント [#l4f43e84] #comment