Summary

JFileChooserFilePaneCellEditorが表示中にJFileChooserのサイズ変更が発生した場合、そのリネームをキャンセルするComponentListenerを作成します。

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, Kotlin

Explanation

  • Default
    • デフォルトのMetalLookAndFeelWindowsLookAndFeelJFileChooserListView中のファイル名を編集するCellEditorを表示したままJFileChooserをリサイズしてもCellEditorは編集状態を維持する
    • このため、CellEditorの表示中にJFileChooserをリサイズして編集中のセル位置が変化した場合、上記のスクリーンショットのようにCellEditorの位置がずれてしまう場合がある
    • FileDialogではそのリサイズでリネームはキャンセルされる
    • DetailsViewCellEditorJFileChooserのリサイズでセル位置は変化しない、またカラムのリサイズでもリネームはキャンセルされる
  • JFileChooser
    • ComponentListener#componentResized(...)をオーバーライドしてリサイズイベントが発生したらリネームをキャンセルするComponentListenerJFileChooserに追加
    • sun.swing.FilePane.cancelEdit()は直接実行できないので、JFileChooser#setSelectedFile(null)を実行することでリネームをキャンセルする
    • JFileChooserのリサイズでリネームをキャンセルするとCellEditorの表示が一瞬チラつく場合がある?
  • Dialog
    • JFileChooser#createDialog()をオーバーライドして親JDialogにリネームをキャンセルするComponentListenerを追加
    • JFileChooserComponentListenerを追加した場合とは異なり、マウスカーソルがリサイズカーソルの状態でJDialogのフチをプレスした時点でリサイズイベントが発生するため、上記のような表示の乱れは発生しない?
      JFileChooser chooser = new JFileChooser() {
        @Override protected JDialog createDialog(Component parent) {
          JDialog dialog = super.createDialog(parent);
          dialog.addComponentListener(new CancelEditListener(this));
          return dialog;
        }
      };
      

Reference

Comment