JFileChooserがディレクトリ選択モードの場合ファイルフィルタ用のJComboBoxを無効化する
Total: 2186
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
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)
- 「ファイルだけを表示する命令です。」と説明されているが、ファイルもディレクトリも表示は可能でファイルは選択可能、ディレクトリは選択でそのディレクトリに移動するだけになる