9

I'm trying to generate a JFileChooser that has the Windows look-and-feel. I couldn't find a method to change it, so I created a base class that extends JFileChooser that changes the UI with the following code:

public FileChooser(){
  this(null);
}
public FileChooser(String path){
   super(path);
   try {
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

    } catch (Exception e) { System.err.println("Error: " + e.getMessage()); }

Then, in another class, I call

FileChooser chooser = new FileChooser(fileName);
int val = chooser.showOpenDialog(null);

but the dialog box that comes up has the Java look and feel. Any thoughts on how to change this? Is there a method of the JFileChooser class that I can use instead of this extended class?

Thank you!

4

8 回答 8

15

我知道您可以为整个应用程序设置外观,但是如果您喜欢跨平台外观但想要 JFileChoosers 的系统外观,您会怎么做。特别是因为跨平台甚至没有正确的文件图标(看起来很俗气。)

这就是我所做的。这绝对是一个黑客...

public class JSystemFileChooser extends JFileChooser{
   public void updateUI(){
      LookAndFeel old = UIManager.getLookAndFeel();
      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      } 
      catch (Throwable ex) {
         old = null;
      } 

      super.updateUI();

      if(old != null){
         FilePane filePane = findFilePane(this);
         filePane.setViewType(FilePane.VIEWTYPE_DETAILS);
         filePane.setViewType(FilePane.VIEWTYPE_LIST);

         Color background = UIManager.getColor("Label.background");
         setBackground(background);
         setOpaque(true);

         try {
            UIManager.setLookAndFeel(old);
         } 
         catch (UnsupportedLookAndFeelException ignored) {} // shouldn't get here
      }
   }



   private static FilePane findFilePane(Container parent){
      for(Component comp: parent.getComponents()){
         if(FilePane.class.isInstance(comp)){
            return (FilePane)comp;
         }
         if(comp instanceof Container){
            Container cont = (Container)comp;
            if(cont.getComponentCount() > 0){
               FilePane found = findFilePane(cont);
               if (found != null) {
                  return found;
               }
            }
         }
      }

      return null;
   }
}
于 2010-12-03T21:51:02.340 回答
8

如果您不需要更改外观和感觉,您可以尝试将 UIManager.setLookAndFeel(..) 行放在入口类的 main 方法中吗?

这似乎对我有用,尽管我不知道为什么它不能按照你设置的方式工作。

于 2010-02-17T16:11:26.953 回答
4

首先,尝试从命令行运行代码并在那里指定外观以查看它是否可以应用。

 java -Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel YourApp

如果它确实应用了正确的外观,那么您可以在创建 JFileChooser 对话框之前将外观代码添加到程序中。假设一个简单的程序如下所示:

 public static void main(String[] args) {
try {

    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

} 
catch (Exception e) {
   // handle exception
}

JFileChooser chooser = new JFileChooser(); 
//etc
}
于 2010-02-17T16:15:11.080 回答
4

问题是在您调用时已经为您选择了外观super(path)

来自外观和感觉的 Java 教程

注意:如果您要设置 L&F,您应该将其作为应用程序的第一步。否则,无论您请求什么 L&F,您都会冒着初始化 Java L&F 的风险。当静态字段引用 Swing 类时,可能会无意中发生这种情况,这会导致 L&F 被加载。如果尚未指定 L&F,则加载 JRE 的默认 L&F。对于 Sun 的 JRE,默认值为 Java L&F,对于 Apple 的 JRE,默认值为 Apple L&F,依此类推。

要补救,您应该这样做(解释位于此处) - 用以下代码替换您的 try/catch 块:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
this.pack();
于 2010-02-17T16:28:15.847 回答
4

在你的主要方法开始时试试这个。或者,如果您使用的是 netbeans 或 eclipse windowbuilder 生成的代码,请将其放在生成的代码之前。

try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } 
catch (UnsupportedLookAndFeelException e) {}
catch (ClassNotFoundException e) {}
catch (InstantiationException e) {}
catch (IllegalAccessException e) {}
于 2013-07-29T17:35:00.533 回答
1

UIManager.setLookAndFeel(...);如前所述,在 main 方法的早期使用应该是最干净的方法,但在没有进行大量测试的情况下将其添加到现有应用程序时要非常谨慎。

例如,我尝试将LAF更改为WindowsLookAndFeel(以便 JFileChooser 知道“我的文档”实际上是指一个名为“文档”的文件夹)并由于以下行而在不同的模块中 命中NullPointerException :

int separatorWidth = (new JToolBar.Separator()).getSeparatorSize().width;
于 2016-01-20T01:59:49.673 回答
0

如果您需要这个 -> Windows 外观示例

使用可以使用下面的代码(太)!

玩得开心!

JFrame w = new FileExplorerJFrame();

    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(ExcelTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        Logger.getLogger(ExcelTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(ExcelTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (UnsupportedLookAndFeelException ex) {
        Logger.getLogger(ExcelTest.class.getName()).log(Level.SEVERE, null, ex);
    }
    SwingUtilities.updateComponentTreeUI(w);

    w.pack();
    w.setVisible(true);
于 2015-11-21T02:29:30.970 回答
-1

开始:

String path = null;
FileChooser fc=new FileChooser(path);
fc.showOpenDialog(null);

然后在另一个班级:

public FileChooser(){
    this(null);
}

public  FileChooser(String path) {
    super(path);
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        SwingUtilities.updateComponentTreeUI(this);
        this.pack();
    } catch (Exception ex) {
        Logger.getLogger(FileChooser.class.getName()).log(Level.SEVERE, null, ex);
    }

    JFileChooser chooser = new JFileChooser();
}

private void pack() {
    try{
    }catch(UnsupportedOperationException eu){
    };
}
于 2012-05-30T17:40:33.960 回答