JFileChooserがディレクトリ選択モードの場合ファイルフィルタ用のJComboBoxを無効化する
Total: 2544, Today: 1, Yesterday: 3
Posted by aterai at
Last-modified:
Summary
JFileChooserがディレクトリのみ選択可能に設定されている場合、ファイルフィルタ用のJComboBoxを無効化します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
- 上:
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ファイルフィルタの説明(日本語環境の場合「すべてのファイル」)も非表示に設定
Reference
- java - JFileChooserDialog shows filetype filter when set to directory only - Stack Overflow
- JFileChooser.FILES_ONLY (Java Platform SE 8)
- 「ファイルだけを表示する命令です。」と説明されているが、ファイルもディレクトリも表示は可能でファイルは選択可能、ディレクトリは選択でそのディレクトリに移動するだけになる