• category: swing folder: DisableFilterComboBox title: JFileChooserがディレクトリ選択モードの場合ファイルフィルタ用のJComboBoxを無効化する tags: [JFileChooser, JComboBox, JLabel] author: aterai pubdate: 2020-11-02T02:22:30+09:00 description: JFileChooserがディレクトリのみ選択可能に設定されている場合、ファイルフィルタ用のJComboBoxを無効化します。 image: https://drive.google.com/uc?id=1Ed1zBEdBgvUiUOVeBr4rXbopF_1aJgBg

概要

JFileChooserがディレクトリのみ選択可能に設定されている場合、ファイルフィルタ用のJComboBoxを無効化します。

サンプルコード

boolean f = fileChooser.getFileSelectionMode() != JFileChooser.DIRECTORIES_ONLY;
fileChooser.setAcceptAllFileFilterUsed(f);
String labelText = UIManager.getString(
    "FileChooser.filesOfTypeLabelText", fileChooser.getLocale());
SwingUtils.descendants(fileChooser)
    .filter(JLabel.class::isInstance).map(JLabel.class::cast)
    .forEach(label -> {
      if (labelText.equals(label.getText())) {
        Component c = label.getLabelFor();
        label.setEnabled(f);
        if (c instanceof JComboBox<?>) {
          JComboBox<?> combo = (JComboBox<?>) c;
          combo.setEnabled(f);
          ((JComponent) combo.getRenderer()).setOpaque(f);
        }
      }
    });
View in GitHub: Java, Kotlin

解説

  • 上: JFileChooser.FILES_AND_DIRECTORIESJFileChooser.FILES_ONLY
    • ファイルフィルタを選択して拡張子などで表示ファイルを絞り込むことが可能
  • 下: JFileChooser.DIRECTORIES_ONLY
    • ディレクトリのみ表示されるのでファイルフィルタはあまり意味がない
    • JFileChooser以下のコンポーネントを検索してテキストがUIManager.getString("FileChooser.filesOfTypeLabelText", fileChooser.getLocale())と一致するJLabelを取得し、JLabel.getLabelFor()メソッドで割り当てられているコンポーネント(この場合JComboBox)を無効化
    • WindowsLookAndFeel環境などでファイルフィルタ用のJComboBoxを無効化する場合、レンダラーを透明化すると矢印ボタンとテキストエリアの無効化状態の背景色を揃えることが可能
    • JFileChooser#setAcceptAllFileFilterUsed(false)AcceptAllファイルフィルタの説明(日本語環境の場合「すべてのファイル」)も非表示に設定

参考リンク

コメント