Swing/FileChooserCancelEdit のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/FileChooserCancelEdit へ行く。
- 1 (2018-10-29 (月) 16:22:11)
- 2 (2019-01-18 (金) 17:25:41)
- 3 (2020-11-28 (土) 13:29:04)
- 4 (2023-02-23 (木) 18:37:11)
- 5 (2023-09-25 (月) 16:22:01)
- category: swing folder: FileChooserCancelEdit title: JFileChooserの詳細表示でファイル名が編集中の場合はそれをキャンセルする tags: [JFileChooser, JTable] author: aterai pubdate: 2018-10-22T17:08:54+09:00 description: JFileChooserを詳細表示モードで表示したとき、前回のファイル名編集が継続中の場合はそれをキャンセルします。 image: https://drive.google.com/uc?id=1mmE2-oPYGfml1EHlPd7pXonxZxiGUWpelQ
概要
JFileChooser
を詳細表示モードで表示したとき、前回のファイル名編集が継続中の場合はそれをキャンセルします。
Screenshot
Advertisement
サンプルコード
JFileChooser fileChooser1 = new JFileChooser();
JButton button1 = new JButton("removeEditor");
button1.addActionListener(e -> {
Optional.ofNullable(fileChooser.getActionMap().get("viewTypeDetails"))
.ifPresent(a -> {
a.actionPerformed(new ActionEvent(e.getSource(), e.getID(), "viewTypeDetails"));
});
stream(fileChooser1)
.filter(JTable.class::isInstance).map(JTable.class::cast)
.findFirst()
.filter(JTable::isEditing).ifPresent(JTable::removeEditor);
int retvalue = fileChooser1.showOpenDialog(getRootPane());
if (retvalue == JFileChooser.APPROVE_OPTION) {
append(log, fileChooser1.getSelectedFile().getAbsolutePath());
}
});
View in GitHub: Java, Kotlin解説
default
JFileChooser
の詳細表示モード(JTable
)でファイルをマウスのダブルクリックで選択してダイアログを閉じた場合、次回JFileChooser
を再表示するとファイル名セルの編集状態が継続している場合がある- 再現が不安定?なので、仕様ではなくバグなのかもしれない
removeEditor
JFileChooser
を表示する前に子JTable
を検索してJTable#removeEditor()
メソッドを実行し、セルエディタを除去sun.swing.FilePane#cancelEdit()
メソッドが内部でdetailsTable.getCellEditor().cancelCellEditing();
を実行して編集状態を解除しているが、プライベートなので使用しづらい
参考リンク
- Containerの子Componentを再帰的にすべて取得する
- JTableのセルの編集をコミット
JFileChooser
の詳細表示モードで使用するJTable
にtable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
を設定すれば、フォーカスが無くなった時点で編集は破棄される
- JFileChooserを編集不可にする
JFileChooser
でファイル名を編集する必要がない場合は、UIManager.put("FileChooser.readOnly", Boolean.TRUE);
と編集不可にすればこの問題は発生しない