Swing/FileChooserLayoutOrientation のバックアップ(No.11)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/FileChooserLayoutOrientation へ行く。
- 1 (2017-12-04 (月) 15:25:37)
- 2 (2017-12-04 (月) 20:30:16)
- 3 (2017-12-06 (水) 17:09:03)
- 4 (2018-02-15 (木) 14:23:42)
- 5 (2019-08-21 (水) 18:50:47)
- 6 (2021-04-16 (金) 11:59:56)
- 7 (2025-01-03 (金) 08:57:02)
- 8 (2025-01-03 (金) 09:01:23)
- 9 (2025-01-03 (金) 09:02:38)
- 10 (2025-01-03 (金) 09:03:21)
- 11 (2025-01-03 (金) 09:04:02)
- 12 (2025-06-19 (木) 12:41:37)
- 13 (2025-06-19 (木) 12:43:47)
- category: swing folder: FileChooserLayoutOrientation title: JFileChooserのリスト表示を垂直1列に変更する tags: [JFileChooser, JList, HierarchyListener] author: aterai pubdate: 2017-12-04T15:25:19+09:00 description: JFileChooserのリスト表示をデフォルトの垂直優先ニュースペーパースタイルから、JListのデフォルトである垂直1列スタイルに変更します。 image: https://drive.google.com/uc?id=1h6JaUr4zBG52EWKWwBHP2unFTL_rm_r9HA
Summary
JFileChooserのリスト表示をデフォルトの垂直優先ニュースペーパースタイルから、JListのデフォルトである垂直1列スタイルに変更します。
Screenshot

Advertisement
Source Code Examples
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, KotlinExplanation
DefaultJFileChooserのJListを使用するリスト表示のデフォルトは、ファイルが垂直方向の次に水平方向の順に並ぶ「ニュースペーパー・スタイル」- 名前が長いファイルが存在すると、リストが見づらくなる
LayoutOrientation: VERTICALJFileChooserの子要素を検索して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列がデフォルト
- 例えば
Reference
- JList#setLayoutOrientation(...) (Java Platform SE 8)
- Containerの子Componentを再帰的にすべて取得する
- java - Vertical scrolling with a single column in JFileChooser - Stack Overflow