JFileChooser的Windows外观

时间:2010-02-17 16:03:56

标签: java look-and-feel jfilechooser

我正在尝试生成具有Windows外观的JFileChooser。我找不到改变它的方法,所以我创建了一个扩展JFileChooser的基类,用以下代码更改UI:

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()); }

然后,在另一堂课中,我打电话给

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

但是出现的对话框具有Java外观。有关如何改变这一点的任何想法?有没有我可以使用的JFileChooser类的方法而不是这个扩展类?

谢谢!

8 个答案:

答案 0 :(得分:11)

我知道你可以设置整个应用程序的外观和感觉,但如果你喜欢跨平台的外观和感觉但是想要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;
   }
}

答案 1 :(得分:7)

如果您不需要更改外观,是否可以尝试将UIManager.setLookAndFeel(..)行放入入门类的main方法中?

这似乎对我有用,虽然我不知道为什么它不会像你设置它那样起作用。

答案 2 :(得分: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
}

答案 3 :(得分:4)

问题在于Look&当您致电super(path)时,已经为您选择了感觉。

来自Java Tutorial for Look and Feel

  

注意:如果你要设置L& F,你应该这样做   应用程序的第一步。   否则你冒风险   无论如何初始化Java L& F.   您要求的L& F这个可以   静电时不经意间发生   字段引用了一个Swing类   导致L& F被加载。如果没有L& F.   尚未指定,默认   加载了JRE的L& F.对于Sun来说   JRE的默认值是Java L& F,for   Apple的JRE是Apple L& F等   类推。

要解决此问题,您应该执行此操作(explanation located here) - 使用以下代码替换您的try / catch块:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
this.pack();

答案 4 :(得分:2)

在main方法的开头尝试此操作。或者如果您使用的是netbeans或eclipse windowbuilder生成的代码,请将其放在生成的代码之前。

try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } 
catch (UnsupportedLookAndFeelException e) {}
catch (ClassNotFoundException e) {}
catch (InstantiationException e) {}
catch (IllegalAccessException e) {}

答案 5 :(得分:1)

在主要方法的早期使用UIManager.setLookAndFeel(...);应该是前面解释过的最简洁的方法,但在没有经过大量测试的情况下将其添加到现有的应用程序时要非常谨慎。

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

int separatorWidth = (new JToolBar.Separator()).getSeparatorSize().width;

答案 6 :(得分:0)

如果你需要这个 - > Windows Look And Feel Sample

使用可以使用以下代码(也是)!

玩得开心!

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);

答案 7 :(得分:-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){
    };
}