Я знаю, что есть метод SwingUtilities.updateComponentTreeUI(Component c)
, но он не работает отлично. Например, у меня есть JFileChooser
, и текущий вид - это Windows, затем я меняю внешний вид на Nimbus с помощью SwingUtilities.updateComponentTreeUI(mainWindow)
, а стиль главного окна изменяется правильно, но когда я показываю выбор файла с помощью метода JFileChooser.showOpenDialog(Component parent)
, это все еще в ОС Windows. То же самое происходит, если я покажу всплывающее диалоговое окно с методом JPopupMenu.show(Component invoker, int x, int y)
. Любое решение этой проблемы?Как изменить внешний вид swing applicaiton во время выполнения?
ответ
Вызов SwingUtilities.updateComponentTreeUI(mainWindow)
будет обновлять компоненты Swing только в иерархии Swing под mainWindow
.
Если вы храните JFileChooser
где-то в своем коде (например, в поле класса), не показывая JFileChooser
, выбор не будет обновляться вызовом SwingUtilities.updateComponentTreeUI(mainWindow)
. Вы можете обойти это, добавив слушателя к UIManager
себе и вызовите SwingUtilities.updateComponentTreeUI(myStoredFileChooser)
от этого слушателя, когда внешний вид будет изменен.
Удостоверьтесь, что вы не создаете утечку памяти с этим, например. пусть что слушатель имеет WeakReference
к JFileChooser
только (как время жизни UIManager равно время жизни JVM)
Как добавить слушателя в 'UIManager'? –
Отличная работа по выделению 'WeakReference'. –
@ ZhaoYi вы даже потрудились открыть javadoc класса 'UIManager'. В этом случае я уверен, что вы нашли бы ['addPropertyChangeListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/UIManager.html#addPropertyChangeListener (java.beans.PropertyChangeListener)) метод – Robin
Если предположить, что value
этого имя класса нового внешнего вида и ощущение, вот фрагмент кода для обновления все окна и суб-компоненты:
public static void updateLAF(String value) {
if (UIManager.getLookAndFeel().getClass().getName().equals(value)) {
return;
}
try {
UIManager.setLookAndFeel(value);
for (Frame frame : Frame.getFrames()) {
updateLAFRecursively(frame);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void updateLAFRecursively(Window window) {
for (Window childWindow : window.getOwnedWindows()) {
updateLAFRecursively(childWindow);
}
SwingUtilities.updateComponentTreeUI(window);
}
Это не поможет, если вы кешируете компонент Swing, который не является частью иерархии Swing в вашем собственном коде. – Robin
@Robin Действительно, хороший улов для кэшированных компонентов. Тем не менее, если он встроен в другой компонент, который является иерархией, другой вариант заключается в переопределении 'updateUI', вызове' super.updateUI', а также переадресации вызова в файл-выбор. –
Я знаю это благодаря опыту. Уже потратьте некоторое время на эту проблему в моем собственном коде. Обычно для выбора файла он не содержится в иерархии, но только открывается в диалоговом окне при необходимости – Robin
- 1. Изменить внешний вид Swing
- 2. Внешний вид Java во время выполнения
- 3. как изменить внешний вид Android приложения во время выполнения
- 4. Изменение UIToolBar (внешний вид) во время выполнения
- 5. Изменить вид во время выполнения
- 6. интегрировать внешний вид JSF во время выполнения
- 7. Как изменить внешний вид swing в netbeans
- 8. изменить вид действияBar во время выполнения
- 9. Изменить Framelayout вид сверху во время выполнения
- 10. внешний вид добавить вкладки добавления во время выполнения
- 11. Как изменить внешний вид java swing без перезапуска приложения?
- 12. Изменить язык в java swing во время выполнения
- 13. Как изменить расположение JTextArea во время выполнения?
- 14. Java Swing: добавить ресурсы во время выполнения
- 15. Изменить язык во время выполнения
- 16. Как изменить внешний вид ListView?
- 17. Изменить SelectedValuePath во время выполнения
- 18. изменить сборку во время выполнения?
- 19. Изменить внешний вид сайта
- 20. Java, загружающий внешний класс во время выполнения
- 21. Изменить внешний вид блесны
- 22. Изменить web.config во время выполнения
- 23. Изменить string.xml во время выполнения
- 24. Android - Загрузите внешний .jar во время выполнения
- 25. проверить, если вид загружаются во время выполнения
- 26. Изменить внешний вид UIStepper
- 27. Изменить контроллер в контейнере во время выполнения
- 28. MVC4 вид здания во время выполнения
- 29. Как изменить внешний вид консоли?
- 30. Как изменить внешний вид флажка?
Чтобы быть ясно, вы также скорректировали ток L & F с [ 'UIManager.setLookAndFeel()'] (http://docs.oracle.com/javase/7/docs/ апи/javax/качели/UIManager.html # setLookAndFeel% 28java.lang.String% 29)? –
Конечно, я сделал! –