JFileChooserの詳細表示でファイル名が編集中の場合はそれをキャンセルする
Total: 2061
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
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
を再表示するとファイル名セルの編集状態が継続している場合がある- 再現が不安定?なので仕様ではなくバグなのかもしれない
Java 21
で以下のようにBasicTableUI.java
が修正されて発生しなくなった?} else if (key == CANCEL_EDITING) { if (table.isEditing()) { table.getCellEditor().cancelCellEditing(); } table.removeEditor(); // ...
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);
と編集不可にすればこの問題は発生しない