JFileChooserのリサイズでファイル名編集をキャンセルする
Total: 332, Today: 3, Yesterday: 1
Posted by aterai at
Last-modified:
Summary
JFileChooserのFilePaneでCellEditorが表示中にJFileChooserのサイズ変更が発生した場合、そのリネームをキャンセルするComponentListenerを作成します。
Screenshot

Advertisement
Source Code Examples
class CancelEditListener extends ComponentAdapter {
private final JFileChooser chooser;
protected CancelEditListener(JFileChooser chooser) {
super();
this.chooser = chooser;
}
@Override public void componentResized(ComponentEvent e) {
// sun.swing.FilePane.cancelEdit();
chooser.setSelectedFile(null);
}
}
View in GitHub: Java, KotlinDescription
Default- デフォルトの
MetalLookAndFeelやWindowsLookAndFeelのJFileChooserでListView中のファイル名を編集するCellEditorを表示したままJFileChooserをリサイズしてもCellEditorは編集状態を維持する - このため、
CellEditorの表示中にJFileChooserをリサイズして編集中のセル位置が変化した場合、上記のスクリーンショットのようにCellEditorの位置がずれてしまう場合がある - FileDialogではそのリサイズでリネームはキャンセルされる
DetailsViewのCellEditorはJFileChooserのリサイズでセル位置は変化しない、またカラムのリサイズでもリネームはキャンセルされる
- デフォルトの
JFileChooserComponentListener#componentResized(...)をオーバーライドしてリサイズイベントが発生したらリネームをキャンセルするComponentListenerをJFileChooserに追加sun.swing.FilePane.cancelEdit()は直接実行できないので、JFileChooser#setSelectedFile(null)を実行することでリネームをキャンセルする- JFileChooserの詳細表示でファイル名が編集中の場合はそれをキャンセルする
DetailsViewでのCellEditorもこのComponentListener#componentResized(...)でキャンセルされる
JFileChooserのリサイズでリネームをキャンセルするとCellEditorの表示が一瞬チラつく場合がある?
DialogJFileChooser#createDialog()をオーバーライドして親JDialogにリネームをキャンセルするComponentListenerを追加JFileChooserにComponentListenerを追加した場合とは異なり、マウスカーソルがリサイズカーソルの状態でJDialogのフチをプレスした時点でリサイズイベントが発生するため、上記のような表示の乱れは発生しない?JFileChooser chooser = new JFileChooser() { @Override protected JDialog createDialog(Component parent) { JDialog dialog = super.createDialog(parent); dialog.addComponentListener(new CancelEditListener(this)); return dialog; } };
Reference
- JListのセルに配置したJLabelのテキストを編集する
- JFileChooserのセルエディタでリネームを開始したとき拡張子を除くファイル名を選択状態にする
- FileDialogでファイルを選択する
- JFileChooserの詳細表示でファイル名が編集中の場合はそれをキャンセルする