概要

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

スクリーンショット

Swing/DisableFilterComboBox.png

サンプルコード

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 all

解説

  • 上: 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ファイルフィルタの説明(日本語環境の場合「すべてのファイル」)も非表示に設定

参考リンク

コメント