Swing/TerminateEdit のバックアップ(No.15)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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のセルの編集をコミット
Posted by aterai at 2007-04-16
JTableのセルの編集をコミット
セルの編集中、フォーカスが別のコンポーネントに移動した場合、その編集を確定する方法をテストします。
- &jnlp;
- &jar;
- &zip;
サンプルコード
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
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();
}
}
});
table.getTableHeader().addMouseListener(new MouseAdapter() {
@Override public void mousePressed(MouseEvent e) {
if(!headerCheck.isSelected()) return;
if(table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
}
});
解説
デフォルトのJTableでは、タブキーやマウスのクリックなどで同じテーブルの別セルにフォーカスが移動すると編集が確定しますが、別のコンポーネントにフォーカスが移動しても編集は確定しません。
- table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);とすると、
- 同じフレームを親に持つコンポーネントにフォーカスが移動したとき、編集が確定するようになります。
- 別フレームのコンポーネントにフォーカスが移動しても編集中のままです。
- ヘッダをクリック、入れ替え、サイズ変更すると、編集はキャンセルされます。
- DefaultCellEditorからエディタコンポーネントを取得し、FocusListenerを設定して、セルが編集中ならtable.getCellEditor().stopCellEditing();とすると、
- 別フレームのコンポーネントにフォーカスが移動したときも、編集が確定するようになります。
- ヘッダをクリック、入れ替え、サイズ変更すると、編集はキャンセルされます。
- TableHeaderにMouseListenerを設定して、セルが編集中ならtable.getCellEditor().stopCellEditing();とすると、
- ヘッダをクリックしたとき、編集が確定するようになります。
- JDK 1.7.0 では、TableHeaderにこのMouseListenerを設定しなくても編集が確定するように修正されています。
- Bug ID: 4330950 Lost newly entered data in the cell when resizing column width
親フレームの状態変化でテーブルのヘッダのサイズ変更が発生する場合、ヘッダのリサイズモデルによって、編集中のセルの状態変化が異なります(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();
}
}
});
参考リンク
コメント
- どわー。助かりましたっ! -- shun?
- お役に立てて何よりです(自分もこの辺りよく混乱します)。 -- aterai
- columnMarginChanged、役に立ちました。ありがとうございます。 -- はじめ?
- どうもです。JTable#columnMarginChangedメソッドの JavaDoc の説明では、"If a cell is being edited, then editing is stopped and the cell is redrawn."となっているので、JTable#editingStoppedメソッドを使っているのかなと思ったら、実際は、JTable#editingCanceledメソッド(=JTable#removeEditorメソッド)でキャンセルしているので、ちょっと注意が必要なんですよね。 -- aterai