• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JFileChooserのデフォルトをDetails Viewに設定
#navi(../)
#tags()
RIGHT:Posted by &author(aterai); at 2011-01-10
*JFileChooserのデフォルトをDetails Viewに設定 [#f6a8221b]
JFileChooserを開いたときのデフォルトをリストではなく詳細に変更します。
---
category: swing
folder: DetailsViewFileChooser
title: JFileChooserのデフォルトをDetails Viewに設定
tags: [JFileChooser, FilePane]
author: aterai
pubdate: 2011-01-10T17:02:55+09:00
description: JFileChooserを開いたときのデフォルトをリストではなく詳細に変更します。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TSq77M-soeI/AAAAAAAAAxg/0nnen-n-cAY/s800/DetailsViewFileChooser.png
---
* 概要 [#summary]
`JFileChooser`を開いたときのデフォルトをリストではなく詳細に変更します。

//-&jnlp;
-&jar;
-&zip;
#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TSq77M-soeI/AAAAAAAAAxg/0nnen-n-cAY/s800/DetailsViewFileChooser.png)

//#screenshot
#ref(http://lh3.ggpht.com/_9Z4BYR88imo/TSq77M-soeI/AAAAAAAAAxg/0nnen-n-cAY/s800/DetailsViewFileChooser.png)

**サンプルコード [#bb304f2a]
* サンプルコード [#sourcecode]
#code(link){{
searchAndClick(chooser, UIManager.getIcon("FileChooser.detailsViewIcon"));
// java - How can I start the JFileChooser in the Details view? - Stack Overflow]
// https://stackoverflow.com/questions/16292502/how-can-i-start-the-jfilechooser-in-the-details-view
// for (Object key: chooser.getActionMap().allKeys()) {
//   System.out.println(key);
// }
String cmd = "viewTypeDetails";
Optional.ofNullable(chooser.getActionMap().get(cmd))
  .ifPresent(a -> a.actionPerformed(new ActionEvent(e.getSource(), e.getID(), cmd)));
}}

* 解説 [#explanation]
- [https://stackoverflow.com/questions/16292502/how-can-i-start-the-jfilechooser-in-the-details-view java - How can I start the JFileChooser in the Details view? - Stack Overflow]で紹介されている`ActionMap`から`viewTypeDetails`アクションを取得して`DetailsView`(詳細)に切り替え

#code{{
// @see javax/swing/plaf/basic/BasicFileChooserUI.java
ActionMap map = new ActionMapUIResource();
Action refreshAction = new UIAction(FilePane.ACTION_REFRESH) {
  public void actionPerformed(ActionEvent e) {
    getFileChooser().rescanCurrentDirectory();
  }
};
map.put(FilePane.ACTION_APPROVE_SELECTION, getApproveSelectionAction());
map.put(FilePane.ACTION_CANCEL, getCancelSelectionAction());
map.put(FilePane.ACTION_REFRESH, refreshAction);
map.put(FilePane.ACTION_CHANGE_TO_PARENT_DIRECTORY, getChangeToParentDirectoryAction());

// sun.swing.FilePane.ACTION_APPROVE_SELECTION = "approveSelection";
// sun.swing.FilePane.ACTION_CANCEL            = "cancelSelection";
// sun.swing.FilePane.ACTION_EDIT_FILE_NAME    = "editFileName";
// sun.swing.FilePane.ACTION_REFRESH           = "refresh";
// sun.swing.FilePane.ACTION_CHANGE_TO_PARENT_DIRECTORY = "Go Up";
// sun.swing.FilePane.ACTION_NEW_FOLDER        = "New Folder";
// sun.swing.FilePane.ACTION_VIEW_LIST         = "viewTypeList";
// sun.swing.FilePane.ACTION_VIEW_DETAILS      = "viewTypeDetails";
}}

- `MetalLookAndFeel`などの`JFileChooser`の子で`UIManager.getIcon("FileChooser.detailsViewIcon")`アイコンが設定されている`JToggleButton`を検索、`doClick()`することで`List`から`DetailsView`(詳細)に切り替え
-- `WindowsLookAndFeel`での`JFileChooser`の`DetailsView`切り替えは`JRadioButtonMenuItem`なのでこの方法は使用不可

#code{{
// searchAndClick(chooser, UIManager.getIcon("FileChooser.detailsViewIcon"));
private static boolean searchAndClick(Container parent, Icon icon) {
  for(Component c:parent.getComponents()) {
    if(c instanceof JToggleButton && ((JToggleButton)c).getIcon()==icon) {
      ((AbstractButton)c).doClick();
  for (Component c:parent.getComponents()) {
    if (c instanceof JToggleButton && ((JToggleButton) c).getIcon() == icon) {
      ((AbstractButton) c).doClick();
      return true;
    }else{
      if(searchAndClick((Container)c, icon)) return true;
    } else {
      if (searchAndClick((Container) c, icon)) {
        return true;
      }
    }
  }
  return false;
}
}}

**解説 [#d6cd620d]
上記のサンプルでは、JFileChooserの子で、UIManager.getIcon("FileChooser.detailsViewIcon")アイコンが設定されているJToggleButtonを検索し、doClick()することで、ListからDetailsView(詳細)に切り替えています。
- 警告されるが以下のように`sun.swing.FilePane#setViewType(sun.swing.FilePane.VIEWTYPE_DETAILS)`メソッドを使用する方法もある

----
警告されますが、以下のように sun.swing.FilePane#setViewType(sun.swing.FilePane.VIEWTYPE_DETAILS) メソッドを使用する方法もあります。
#code{{
FilePane filePane = (FilePane)findChildComponent(chooser, FilePane.class);
FilePane filePane = (FilePane) findChildComponent(chooser, FilePane.class);
filePane.setViewType(FilePane.VIEWTYPE_DETAILS);
}}

**参考リンク [#k11fb09b]
-[http://tips4java.wordpress.com/2008/11/13/swing-utils/ Swing Utils « Java Tips Weblog]
* 参考リンク [#reference]
- [https://stackoverflow.com/questions/16292502/how-can-i-start-the-jfilechooser-in-the-details-view java - How can I start the JFileChooser in the Details view? - Stack Overflow]
- [https://tips4java.wordpress.com/2008/11/13/swing-utils/ Swing Utils « Java Tips Weblog]
-- via: [http://www.java-forums.org/awt-swing/13733-set-jfilechooser-default-details-view.html set jFileChooser default to details view - Java Forums]
-[http://www.docjar.com/html/api/sun/swing/FilePane.java.html sun.swing: FilePane.java]
- [http://www.docjar.com/html/api/sun/swing/FilePane.java.html sun.swing: FilePane.java]

**コメント [#k2202d2b]
* コメント [#comment]
#comment
#comment