Внешний вид Windows для JFileChooser - PullRequest
9 голосов
/ 17 февраля 2010

Я пытаюсь сгенерировать JFileChooser, который имеет внешний вид Windows. Я не смог найти метод для его изменения, поэтому я создал базовый класс, расширяющий JFileChooser, который изменяет пользовательский интерфейс с помощью следующего кода:

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 ]

11 голосов
/ 04 декабря 2010

Я знаю, что вы можете настроить внешний вид всего приложения, но что делать, если вам нравится кроссплатформенный внешний вид, но вы хотите, чтобы System Look and Feel применялась для 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;
   }
}
7 голосов
/ 17 февраля 2010

Если вам не нужно изменять внешний вид, не могли бы вы попробовать вставить строку UIManager.setLookAndFeel (..) в основной метод вашего класса входа?

Кажется, это работает для меня, хотя я не понимаю, почему это не сработает так, как вы его настроили.

4 голосов
/ 17 февраля 2010

Проблема в том, что Look & Feel уже был выбран для вас, когда вы звонили super(path).

Из Java-учебника по внешнему виду :

Примечание : Если вы собираетесь установить L & F, вы должны сделать это как первый шаг в вашем приложении. В противном случае вы рискуете инициализация Java L & F независимо о том, что L & F вы просили. Это может произойдет непреднамеренно, когда статический поле ссылается на класс Swing, который вызывает загрузку L & F. Если нет L & F еще не указан, по умолчанию L & F для JRE загружен. Для солнца 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();
4 голосов
/ 17 февраля 2010

Сначала попробуйте запустить код из командной строки и укажите его внешний вид, чтобы увидеть, что он может быть применен.

 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
}
2 голосов
/ 29 июля 2013

Попробуйте это в начале вашего основного метода. Или, если вы используете netbeans или сгенерированный код Eclipse Windowbuilder, поместите его перед сгенерированным кодом.

try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } 
catch (UnsupportedLookAndFeelException e) {}
catch (ClassNotFoundException e) {}
catch (InstantiationException e) {}
catch (IllegalAccessException e) {}
1 голос
/ 20 января 2016

Использование UIManager.setLookAndFeel(...); в начале вашего основного метода должно быть самым чистым подходом, как объяснено ранее, но будьте очень осторожны при добавлении его в существующее приложение без тщательного тестирования.

Например, я попытался изменить LAF на WindowsLookAndFeel (чтобы JFileChooser знал, что «Мои документы» на самом деле относится к папке с именем «Документы») и нажал NullPointerException в другом модуле из-за следующей строки:

int separatorWidth = (new JToolBar.Separator()).getSeparatorSize().width;
0 голосов
/ 21 ноября 2015

Если вам это нужно -> Пример Windows Look And Feel

Используйте можете использовать приведенный ниже код (тоже)!

Веселись!

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);
0 голосов
/ 30 мая 2012

Для начала:

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){
    };
}
...