Окна выглядят и чувствуют для JFileChooser

Я пытаюсь создать JFileChooser это имеет внешний вид окон. Я не мог найти метод для его изменения, поэтому я создал базовый класс, который расширяет 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 ответов


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

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


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

проблема в том, что внешний вид был уже выбран для вас, когда вы позвонили super(path).

С Java учебник для внешнего вида:

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

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

 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
}

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

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

Если вам это нужно -> Окна Выглядят И Чувствуют Образец

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

удачи!

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

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

например, я попытался изменить ЛАФ до WindowsLookAndFeel (так что JFileChooser знает, что" мои документы " на самом деле относится к папке с именем "документы") и нажмите NullPointerException в другом модуле из-за следующая строка:

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

Для начала:

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