Окна выглядят и чувствуют для 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){
};
}