Swing/TerminateEdit のバックアップ(No.26)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- category: swing folder: TerminateEdit title: JTableのセルの編集をコミット tags: [JTable, Focus, JTableHeader, TableCellEditor] author: aterai pubdate: 2007-04-16T12:24:10+09:00 description: セルの編集中、フォーカスが別のコンポーネントに移動した場合、その編集を確定する方法をテストします。 image:
概要
セルの編集中、フォーカスが別のコンポーネントに移動した場合、その編集を確定する方法をテストします。
Screenshot
Advertisement
サンプルコード
解説
デフォルトのJTable
では、Tabキーやマウスのクリックなどで同じテーブルの別セルにフォーカスが移動すると編集が確定しますが、別のコンポーネントにフォーカスが移動しても編集は確定しません。
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
を設定:- 同じフレームを親に持つコンポーネントにフォーカスが移動したとき、編集が確定する
- 別フレームのコンポーネントにフォーカスが移動しても編集中のまま
- ヘッダをクリック、入れ替え、サイズ変更すると、編集はキャンセルされる
DefaultCellEditor
からエディタコンポーネントを取得し、FocusListener
を設定し、セルが編集中ならtable.getCellEditor().stopCellEditing();
を実行:- 別フレームのコンポーネントにフォーカスが移動したときも、編集が確定する
- ヘッダをクリック、入れ替え、サイズ変更すると、編集はキャンセルされる
DefaultCellEditor dce = (DefaultCellEditor) table.getDefaultEditor(Object.class);
dce.getComponent().addFocusListener(new FocusAdapter() {
@Override public void focusLost(FocusEvent e) {
if (!focusCheck.isSelected()) {
return;
}
if (table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
}
});
TableHeader
にMouseListener
を設定して、セルが編集中ならtable.getCellEditor().stopCellEditing();
を実行:- ヘッダをクリックしたとき、編集が確定する
JDK 1.7.0
では、このようなMouseListener
をTableHeader
に設定しなくても、編集が確定するように修正済み- Bug ID: 4330950 Lost newly entered data in the cell when resizing column width
table.getTableHeader().addMouseListener(new MouseAdapter() {
@Override public void mousePressed(MouseEvent e) {
if (!headerCheck.isSelected()) {
return;
}
if (table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
}
});
親フレームの状態変化でテーブルのヘッダのサイズ変更が発生する場合、ヘッダのリサイズモデルによって、編集中のセルの状態変化が異なります(JDK 1.7.0
では修正済み: Bug ID: 4330950 Lost newly entered data in the cell when resizing column width)。
JTable.AUTO_RESIZE_OFF
- 親フレームのリサイズや最大化は編集中のまま
JTable.AUTO_RESIZE_ALL_COLUMNS
など- 親フレームのリサイズや最大化を行うとヘッダのサイズが変化するため、キャンセル扱い
ヘッダのサイズが変化しない場合は、どちらの設定でも以下のようになります。
- 親フレームの最小化(アイコン化)は編集中のまま
- 親フレームを閉じる場合はキャンセル扱い
親フレームの状態変化に応じて編集の確定を行う場合は、以下のように、JTable#columnMarginChanged
メソッドなどをオーバーライドしたり、各種リスナーを設定する必要があります。
table = new JTable(sorter) {
@Override public void columnMarginChanged(ChangeEvent e) {
if (table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
super.columnMarginChanged(e);
}
};
frame.addWindowListener(new WindowAdapter() {
@Override public void windowClosing(WindowEvent e) {
if (table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
}
});
frame.addWindowStateListener(new WindowStateListener() {
@Override public void windowStateChanged(WindowEvent e) {
if (frame.getExtendedState() == JFrame.MAXIMIZED_BOTH && table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
}
});