Например, текущий шрифт, которым делаются надписи класса Jlabel, можно получить так:
Font labelFont = UIManager.getFont("Label.font");
Кроме того, статическим методом getDefaults() можно получить ссылку на экземпляр класса UIDefaults, используемый классом UIManager.
Просмотреть все несколько сотен свойств, хранящихся в модели данных UIDefaults, можно так:
UIDefaults defs = UIManager.getDefaults();
Enumeration keys = defs.keys();
Enumeration elem = defs.elements();
while (keys.hasMoreElements() && elem.hasMoreElements())
System.out.println(
keys.nextElement() + ": " + elem.nextElement());
Статический метод
put(Object key, Object value);
меняет только пользовательские установки различных свойств, оставляя установки L&F без изменения. Посмотреть установки L&F можно статическим методом
geLookAndFeelDefaults (), возвращающим экземпляр класса UIDefaults.
Для того чтобы легче переключать вид и поведение приложения, класс UIManager хранит несколько L&F под произвольно данными именами в виде массива объектов вложенного класса UIManager.LookAndFeelInfo. Новый элемент заносится в этот массив статическим методом
installLookAndFeel(String name, String className);
вызывающим конструктор класса UIManager.LookAndFeelInfo, или статическим методом
installLookAndFeel(UIManager.LookAndFeelInfo);
По умолчанию хранятся платформенные L&F, CDE/Motif, Nimbus и Java L&F. Посмотреть имена всех имеющихся в массиве L&F можно так:
UIManager.LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels(); for (int i = 0; i < info.length; i++)
System.out.println(info[i].getName());
Задание стандартного L&F
Очень легко задать один из стандартных PL&F, воспользовавшись одним из статических методов setLookAndFeel(LookAndFeel) или setLookAndFeel(String) класса UIManager. Аргумент второго из этих методов — строка, содержащая полное имя нужного класса XxxLoo kAnd Feel со всеми подпакетами. Например, строка "javax.swing.plaf.metal. MetalLookAndFeel" задает имя класса, определяющего Java L&F. Поскольку это имя может измениться в следующих версиях Java SE, то для получения имени класса Java L&F лучше пользоваться статическим методом getCrossPlatformLookAndFeelClassName() класса UIManager. Впрочем, Java L&F устанавливается по умолчанию, как можно видеть из многочисленных примеров, приведенных в предыдущих главах. Еще один статический метод getSystemLookAndFeelClassName () класса UIManager возвращает полное имя класса, определяющего стандартный L&F для данной платформы. Обычный способ задания платформенного L&F выглядит так:
public static void main(String[] args){ try{
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}catch(Exception e){}
new SomeSwingApplication();
}
Обрабатывать исключение здесь не нужно, потому что в ответ на его выбрасывание устанавливается Java L&F.
Для получения строки с полным именем класса CDE/Motif в классе UIManager никакого метода нет, ее надо задавать прямо:
UIManager.setLookAndFeel(
"com.sun.j ava.swing.plaf.motif.MotifLookAndFeel");
В листинге 17.1 приведена программа, создавшая рис. 17.1. В ней каждое внутреннее окно строится по правилам одного из стандартных L&F.
import java.awt.*; import javax.swing.*;
public class DiffLAF extends JFrame{
DiffLAF(){
super(" Окно с разными L&F"); setLayout(new FlowLayout());
JInternalFrame ifr1 =
new JInternalFrame(" Oкно Metal", true, true, true, true); ifr1.getContentPane().add(new JLabel(" Это окно Java L&F")); ifr1.setPreferredSize(new Dimension(200, 100)); ifr1.setVisible(true); add(ifr1);
try{
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
JInternalFrame ifr2 =
new JInternalFrame(" Окно Windows", true, true, true, true); i fr2.getContentPane().add(