Дизайнерская мысль не стоит на месте, и на смену Java L&F идет Nimbus L&F, впервые появившийся в JDK 1.6.0_10. Оформление Nimbus создается средствами Java 2D и использует богатейшие возможности этой библиотеки, некоторые из них мы рассмотрели в
Вид и поведение Nimbus создаются классом NimbusLookAndFeel и другими классами из пакета j avax.swing.plaf.nimbus.
Сведения, собранные в каждом из этих классов, образуют
Кроме системных и платформенных сведений есть еще
Наивысший приоритет имеют пользовательские сведения. Если они не заданы, то исполняющая система Swing отыскивает платформенные сведения. Не найдя их, она берет нужные значения из системных сведений.
Итак, на каждой платформе можно установить четыре стандартных L&F: "родной" для данной платформы, CDE/Motif, Nimbus и Java L&F. Они выглядят как на рис. 17.1.
Окно верхнего уровня класса JFrame или JDialog, зарегистрированное в оконном менеджере графической подсистемы операционной системы, оформляется по правилам этого оконного менеджера.
Его внешний вид можно изменить только специальными ухищрениями, а именно статическими методами
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
JFrame newLAFWin = new JFrame();
После выполнения этих методов, если оконный менеджер может создавать окна без оформления и если текущий L&F способен оформлять окна, все создаваемые окна класса JFrame и JDialog будут оформлены текущим L&F, как показано на рис. 17.4.
Рис. 17.1. Стандартные L&F |
Чтобы оформить отдельное окно верхнего уровня текущим L&F, надо сначала отключить его оформление оконным менеджером, а затем установить новый стиль оформления методом setWindowDecorationStyle(int) класса JRootPane:
JFrame fr = new JFrame(); fr.setUndecorated(true);
fr.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
Все остальные элементы графического интерфейса пользователя могут тоже оформляться, как принято текущим оконным менеджером, следовать правилам другого оконного менеджера или быть оформлены в своей манере. Вид и поведение графического приложения определяются перед его загрузкой, но можно изменить их уже во время работы приложения.
Это свойство графических элементов библиотеки Swing получило название Pluggable Look and Feel, сокращенно — PL&F, PLAF или plaf.
Получение свойств L&F
Для получения свойств текущего L&F и установки нового L&F нужно заменить классы XxxLookAndFeel на класс UIManager из пакета javax.swing. Он содержит массу статических методов, позволяющих получить сведения об элементах L&F, изменить некоторые элементы или вообще сменить L&F.
Объект класса UIManager ищет название L&F сначала как значение системного свойства swing.defaultlaf, созданного, например, при запуске приложения из командной строки с ключом -d:
j ava -Dswing.defaultlaf=com.sun.j ava.swing.plaf.motif.MotifLookAndFeel
SomeSwingApplication
Если такое системное свойство не определено, объект ищет файл swing.properties, обычно лежащий в каталоге $JAVA_HOME/lib. Если он существует, то в нем отыскивается значение ключа swing.defaultlaf, например:
swing.defaultlaf=com.sun.j ava.swing.plaf.motif.MotifLookAndFeel
Если такого ключа нет или вообще отсутствует файл swing.properties, то устанавливается Java L&F.
Вы всегда можете создать или изменить файл swing.properties, записав в него другой L&F, например:
swing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel
После этого по умолчанию будет установлен Nimbus.
Для хранения свойств текущего L&F класс UIManager использует модель данных — объект класса UIDefaults. Класс UIDefaults расширяет класс Hashtable, следовательно, является хеш-таблицей, состоящей из пар "ключ — значение" (key — value). Кроме обычного для хеш-таблицы метода get(Object key), возвращающего значение value ключа key, и метода put(Object key, Object value), устанавливающего значение value с ключом key, класс UIDefaults содержит специализированные методы для определенных типов данных, хранящихся в таблице. Они позволяют избавиться от приведения типов, так надоедающего при вызове метода get(Object).
Например, метод getBoolean(Object key) возвращает значение ключа key, если оно имеет
тип boolean. Аналогично действуют методы getBorder(Object), getColor(Object), getDimension(Object), getFont(Object), getIcon(Object), getInsets(Object), getInt(Object), getString(Object). У каждого из них есть парный метод getXxx (Object, Locale), возвращающий значение ключа для данной локали.
Экземпляр класса UIDefaults, используемый в классе UIManager, — это