Swing/DisableFilterComboBox のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DisableFilterComboBox へ行く。
- 1 (2020-11-02 (月) 02:23:18)
- 2 (2022-09-22 (木) 20:52:45)
- 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を無効化します。
Screenshot
Advertisement
サンプルコード
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_DIRECTORIES
、JFileChooser.FILES_ONLY
- ファイルフィルタを選択して拡張子などで表示ファイルを絞り込むことが可能
- 下:
JFileChooser.DIRECTORIES_ONLY
- ディレクトリのみ表示されるのでファイルフィルタはあまり意味がない
JFileChooser
以下のコンポーネントを検索してテキストがUIManager.getString("FileChooser.filesOfTypeLabelText", fileChooser.getLocale())
と一致するJLabel
を取得し、JLabel.getLabelFor()
メソッドで割り当てられているコンポーネント(この場合JComboBox
)を無効化WindowsLookAndFeel
環境などでファイルフィルタ用のJComboBox
を無効化する場合、レンダラーを透明化すると矢印ボタンとテキストエリアの無効化状態の背景色を揃えることが可能JFileChooser#setAcceptAllFileFilterUsed(false)
でAcceptAll
ファイルフィルタの説明(日本語環境の場合「すべてのファイル」)も非表示に設定
参考リンク
- java - JFileChooserDialog shows filetype filter when set to directory only - Stack Overflow
- JFileChooser.FILES_ONLY (Java Platform SE 8)
- 「ファイルだけを表示する命令です。」と説明されているが、ファイルもディレクトリも表示は可能でファイルは選択可能、ディレクトリは選択でそのディレクトリに移動するだけになる