JFileChooserのリスト表示を垂直1列に変更する
Total: 2549
, Today: 2
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JFileChooser
のリスト表示をデフォルトの垂直優先ニュースペーパースタイルから、JList
のデフォルトである垂直1
列スタイルに変更します。
Screenshot
Advertisement
サンプルコード
JButton button2 = new JButton("LayoutOrientation: VERTICAL");
button2.addActionListener(e -> {
JFileChooser chooser = new JFileChooser();
stream(chooser)
.filter(JList.class::isInstance)
.map(JList.class::cast)
.findFirst()
.ifPresent(list -> {
list.addHierarchyListener(new HierarchyListener() {
@Override public void hierarchyChanged(HierarchyEvent e) {
if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0
&& e.getComponent().isShowing()) {
list.putClientProperty("List.isFileList", Boolean.FALSE);
list.setLayoutOrientation(JList.VERTICAL);
}
}
});
});
int retvalue = chooser.showOpenDialog(log.getRootPane());
if (retvalue == JFileChooser.APPROVE_OPTION) {
log.setText(chooser.getSelectedFile().getAbsolutePath());
}
});
View in GitHub: Java, Kotlin解説
Default
JFileChooser
のJList
を使用するリスト表示のデフォルトは、ファイルが垂直方向の次に水平方向の順に並ぶ「ニュースペーパー・スタイル」- 名前が長いファイルが存在すると、リストが見づらくなる
LayoutOrientation: VERTICAL
JFileChooser
の子要素を検索してJList
を取得し、JList#setLayoutOrientation(JList.VERTICAL)
でファイルが垂直方向1
列に配置されるよう設定sun.swing.FilePane#setViewType(...)
が実行されて表示形式がJTable
を使用するviewTypeDetails
からJList
を使用するviewTypeList
に切り替わる度にJList#setLayoutOrientation(JList.VERTICAL_WRAP)
が実行されるため、JList
がJFileChooser
に設定されて表示されるとJList#setLayoutOrientation(JList.VERTICAL)
を実行するHierarchyListener
を追加- コメントで指摘されているように
sun.swing.FilePane
を使用しないLookAndFeel
ではこのサンプルは無意味- 例えば
GTKLookAndFeel
ではディレクトリ用とファイル用にJList
が使用されているが、どちらも垂直方向1
列がデフォルト
- 例えば
参考リンク
- JList#setLayoutOrientation(...) (Java Platform SE 8)
- Containerの子Componentを再帰的にすべて取得する
- java - Vertical scrolling with a single column in JFileChooser - Stack Overflow