Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Изменение Стили
Как Установить Стиль
Домашняя страница > Создание GUI С JFC/Swing > Изменение Стили

Как Установить Стиль

Архитектура Swing разрабатывается так, чтобы можно было изменить "стиль" (L&F) GUI Вашего приложения (см. Краткий обзор Архитектуры Swing). "Взгляд" обращается к появлению виджетов GUI (более формально, JComponents) и "чувство" обращается к способу, которым ведут себя виджеты.

Архитектура Swing включает многократный L&Fs, разделяя каждый компонент на два отличных класса: a JComponent подкласс и соответствие ComponentUI подкласс. Например, каждый JList у экземпляра есть конкретная реализация ListUI (ListUI расширяется ComponentUI). ComponentUI подкласс упоминается различными именами в документации Swing — "UI," "компонент UI," "делегат UI," и "делегат стили" все используются, чтобы идентифицировать ComponentUI подкласс.

Большинство разработчиков никогда не должно взаимодействовать с делегатом UI непосредственно. По большей части делегат UI используется внутренне JComponent подкласс для решающей функциональности, с методами покрытия, обеспеченными JComponent подкласс для всего доступа к делегату UI. Например, все красящие в JComponent подклассы делегируются делегату UI. Делегируя рисование, 'взгляд' может измениться в зависимости от L&F.

Это - ответственность каждого L&F, чтобы обеспечить конкретную реализацию для каждого из ComponentUI подклассы определяются Swing. Например, Стиль Java создает экземпляр MetalTabbedPaneUI обеспечить L&F для JTabbedPane. Фактическое создание делегата UI обрабатывается Swing для Вас — по большей части Вы никогда не должны взаимодействовать непосредственно с делегатом UI.

Остальная часть этого раздела затрагивает следующие темы:

Доступный Взгляд и Чувства

JRE Sun обеспечивает следующий L&Fs:

  1. CrossPlatformLookAndFeel— это - "Java L&F" (также названный "Металлом"), который выглядит одинаково на всех платформах. Это - часть API Java (javax.swing.plaf.metal) и значение по умолчанию, которое будет использоваться, если Вы ничего не сделаете в своем коде, чтобы установить различное L&F.

  2. SystemLookAndFeel— здесь, приложение использует L&F, который является собственным к системе, на которой оно работает. Система L&F определяется во времени выполнения, где приложение просит, чтобы система возвратила имя соответствующего L&F.

  3. Синтезатор — основание для того, чтобы создать Ваш собственный стиль с XML-файлом.

  4. Мультиплексирование — способ иметь делегата методов UI во многих различных реализациях стили одновременно.

Для Linux и Соляриса, Системой L&Fs является "GTK +", если GTK + 2.2 или позже устанавливается, "Мотив" иначе. Для Windows Система L&F является "Windows", который подражает L&F определенного Windows ОС, который работает — классический Windows, XP, или Vista. GTK +, Мотив, и Windows L&Fs обеспечиваются Sun и поставляются с SDK Java и JRE, хотя они не часть API Java.

Apple обеспечивает свою собственную JVM, которая включает их собственное L&F.

В сводке, когда Вы используете SystemLookAndFeel, это - то, что Вы будете видеть:

Платформа Стиль
Солярис, Linux с GTK + 2.2 или позже GTK +
Другой Солярис, Linux Мотив
UNIX IBM IBM*
HP UX HP*
Классический Windows Windows
Windows XP Windows XP
Windows Vista Windows Vista
Macintosh Macintosh*

* Предоставленный системным поставщиком.

Вы не видите Систему L&F в API. GTK +, Мотив, и пакеты Windows, которых это требует, поставляются с SDK Java как:

com.sun.java.swing.plaf.gtk.GTKLookAndFeel
com.sun.java.swing.plaf.motif.MotifLookAndFeel
com.sun.java.swing.plaf.windows.WindowsLookAndFeel

Отметьте, что путь включает java, и нет javax.


Отметьте: GTK + L&F будет только работать на UNIX или системах Linux с GTK + 2.2 или позже установленный, в то время как Windows L&F работает только на системах Windows. Как Java (Металл) L&F, Мотив L&F будет работать на любой платформе.

У всего Sun L&Fs есть много общности. Эта общность определяется в Basic стиль в API (javax.swing.plaf.basic). Мотив и Windows L&Fs каждый создаются, расширяя классы делегата UI в javax.swing.plaf.basic (пользовательское L&F может быть создано, делая ту же самую вещь). "Основное" L&F не используется без того, чтобы быть расширенным.

В API Вы будете видеть четыре L&F пакеты:

Вы не ограничиваетесь L&Fs предоставленный платформой Java. Можно использовать любого L&F, который находится в пути class Вашей программы. Внешний L&Fs обычно обеспечиваются в одном или более файлах JAR, которые Вы добавляете к пути class своей программы во времени выполнения. Например:

java -classpath .;C:\java\lafdir\customlaf.jar YourSwingApplication

Как только внешнее L&F находится в пути class Вашей программы, Ваша программа может использовать его точно так же как любой из L&Fs поставленный с платформой Java.

Programatically Установка Стили


Отметьте: Если Вы собираетесь установить L&F, следует сделать это как самый первый шаг в Вашем приложении. Иначе Вы рискуете инициализировать Java L&F независимо от того, что L&F Вы запросили. Это может произойти непреднамеренно, когда статическое поле ссылается на Swing class, который заставляет L&F быть загруженным. Если не L&F был все же определен, значение по умолчанию L&F для JRE загружается. Для JRE Sun значение по умолчанию является Java L&F, для JRE Apple Apple L&F, и т.д.

L&F, что компонентное использование Swing определяется посредством UIManager class в javax.swing пакет. Всякий раз, когда компонент Swing создается, компонент спрашивает менеджера по UI по делегату UI, который реализует компонент L&F. Например, каждый JLabel конструктор запрашивает менеджера по UI по объекту делегата UI, подходящему для метки. Это тогда использует тот объект делегата UI реализовать весь его рисунок и обработку событий.

К programatically определяют L&F, используют UIManager.setLookAndFeel() метод с полностью определенным именем соответствующего подкласса LookAndFeel как его параметр. Например, полужирный код в следующем отрывке заставляет программу использовать межплатформенный Java L&F:

public static void main(String[] args) {
    try {
            // Set cross-platform Java L&F (also called "Metal")
        UIManager.setLookAndFeel(
            UIManager.getCrossPlatformLookAndFeelClassName());
    } 
    catch (UnsupportedLookAndFeelException e) {
       // handle exception
    }
    catch (ClassNotFoundException e) {
       // handle exception
    }
    catch (InstantiationException e) {
       // handle exception
    }
    catch (IllegalAccessException e) {
       // handle exception
    }
        
    new SwingApplication(); //Create and show the GUI.
}

Альтернативно, этот код заставляет программу использовать Систему L&F:

public static void main(String[] args) {
    try {
            // Set System L&F
        UIManager.setLookAndFeel(
            UIManager.getSystemLookAndFeelClassName());
    } 
    catch (UnsupportedLookAndFeelException e) {
       // handle exception
    }
    catch (ClassNotFoundException e) {
       // handle exception
    }
    catch (InstantiationException e) {
       // handle exception
    }
    catch (IllegalAccessException e) {
       // handle exception
    }

    new SwingApplication(); //Create and show the GUI.
}

Можно также использовать фактическое имя class Стили как параметр UIManager.setLookAndFeel(). Например,

// Set cross-platform Java L&F (also called "Metal")
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

или

// Set Motif L&F on any platform
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");

Вы не ограничиваетесь предыдущими параметрами. Можно определить имя для любого L&F, который находится в пути class Вашей программы.

Определение Стили: Командная строка

Можно определить L&F в командной строке при использовании -D отметьте, чтобы установить swing.defaultlaf свойство. Например:

java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel MyApp

java -Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel MyApp

Определение Стили: Файл swing.properties

Еще один способ определить ток L&F состоит в том, чтобы использовать swing.properties файл, чтобы установить swing.defaultlaf свойство. Этот файл, который Вы, возможно, должны создать, располагается в lib каталог выпуска Java Sun (другие поставщики Java могут использовать различное расположение). Например, если Вы используете интерпретатор Java в javaHomeDirectory\bin, тогда swing.properties файл (если это существует) находится в javaHomeDirectory\lib. Вот пример содержания a swing.properties файл:

# Swing properties
swing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel

Как менеджер по UI Выбирает Стиль

Вот шаги определения стили, которые происходят, когда менеджер по UI должен установить L&F:

  1. Если программа устанавливает L&F прежде, чем стиль будет необходим, менеджер по UI пытается создать экземпляр указанного стили class. В случае успеха, все компонентное использование это L&F.
  2. Если программа успешно не определила L&F, то менеджер по UI использует L&F определенный swing.defaultlaf свойство. Если свойство определяется в обоих swing.properties файл и на командной строке, определение командной строки имеет приоритет.
  3. Если ни один из этих шагов не привел к допустимому L&F, JRE Sun использует Java L&F. Другие поставщики, такие как Apple, будут использовать свое значение по умолчанию L&F.

Изменение Стили После Запуска

Можно измениться L&F с setLookAndFeel даже после того, как GUI программы видим. Чтобы заставить существующие компоненты отразить новое L&F, вызовите SwingUtilities updateComponentTreeUI метод однажды на высокоуровневый контейнер. Затем Вы могли бы хотеть изменить размеры каждого высокоуровневого контейнера, чтобы отразить новые размеры его содержавших компонентов. Например:

UIManager.setLookAndFeel(lnfName);
SwingUtilities.updateComponentTreeUI(frame);
frame.pack();

Пример

В следующем примере, LookAndFeelDemo.java, можно экспериментировать с различным Взглядом и Чувствами. Программа создает простой GUI с кнопкой и меткой. Каждый раз Вы нажимаете кнопку, инкременты метки.

Можно измениться L&F, изменяясь LOOKANDFEEL постоянный на строке 18. Комментарии к предыдущим строкам говорят Вам, какие значения являются приемлемыми:

    // Specify the look and feel to use by defining the LOOKANDFEEL constant
    // Valid values are: null (use the default), "Metal", "System", "Motif",
    // and "GTK"
    final static String LOOKANDFEEL = "Motif";

Здесь константа устанавливается в "Мотив", который является L&F, который будет работать на любой платформе (как будет значение по умолчанию, "Металл"), ". GTK +" не будет работать на Windows, и "Windows" будет работать только на Windows. Если Вы выберете L&F, который не будет работать, то Вы получите Java, или Металл, L&F.

В разделе кода, где L&F фактически устанавливается, Вы будете видеть несколько различных способов установить это, как обсуждено выше:

if (LOOKANDFEEL.equals("Metal")) {
   lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
   //  an alternative way to set the Metal L&F is to replace the 
   // previous line with:
   // lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";

Можно проверить, что оба параметра работают commenting/un-commenting эти две альтернативы.

Вот перечисление LookAndFeelDemo исходный файл:


package lookandfeel;

import javax.swing.*;          
import java.awt.*;
import java.awt.event.*;
import javax.swing.plaf.metal.*;

public class LookAndFeelDemo implements ActionListener {
    private static String labelPrefix = "Number of button clicks: ";
    private int numClicks = 0;
    final JLabel label = new JLabel(labelPrefix + "0    ");

    // Specify the look and feel to use by defining the LOOKANDFEEL constant
    // Valid values are: null (use the default), "Metal", "System", "Motif",
    // and "GTK"
    final static String LOOKANDFEEL = "Metal";
    
    // If you choose the Metal L&F, you can also choose a theme.
    // Specify the theme to use by defining the THEME constant
    // Valid values are: "DefaultMetal", "Ocean",  and "Test"
    final static String THEME = "Test";
    

    public Component createComponents() {
        JButton button = new JButton("I'm a Swing button!");
        button.setMnemonic(KeyEvent.VK_I);
        button.addActionListener(this);
        label.setLabelFor(button);

        JPanel pane = new JPanel(new GridLayout(0, 1));
        pane.add(button);
        pane.add(label);
        pane.setBorder(BorderFactory.createEmptyBorder(
                                        30, //top
                                        30, //left
                                        10, //bottom
                                        30) //right
                                        );

        return pane;
    }

    public void actionPerformed(ActionEvent e) {
        numClicks++;
        label.setText(labelPrefix + numClicks);
    }

    private static void initLookAndFeel() {
        String lookAndFeel = null;
       
        if (LOOKANDFEEL != null) {
            if (LOOKANDFEEL.equals("Metal")) {
                lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
              //  an alternative way to set the Metal L&F is to replace the 
              // previous line with:
              // lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";
                
            }
            
            else if (LOOKANDFEEL.equals("System")) {
                lookAndFeel = UIManager.getSystemLookAndFeelClassName();
            } 
            
            else if (LOOKANDFEEL.equals("Motif")) {
                lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
            } 
            
            else if (LOOKANDFEEL.equals("GTK")) { 
                lookAndFeel = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
            } 
            
            else {
                System.err.println("Unexpected value of LOOKANDFEEL specified: "
                                   + LOOKANDFEEL);
                lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
            }

            try {
            	
            	
                UIManager.setLookAndFeel(lookAndFeel);
                
                // If L&F = "Metal", set the theme
                
                if (LOOKANDFEEL.equals("Metal")) {
                  if (THEME.equals("DefaultMetal"))
                     MetalLookAndFeel.setCurrentTheme(new DefaultMetalTheme());
                  else if (THEME.equals("Ocean"))
                     MetalLookAndFeel.setCurrentTheme(new OceanTheme());
                  else
                     MetalLookAndFeel.setCurrentTheme(new TestTheme());
                     
                  UIManager.setLookAndFeel(new MetalLookAndFeel()); 
                }	
                	
                	
                  
                
            } 
            
            catch (ClassNotFoundException e) {
                System.err.println("Couldn't find class for specified look and feel:"
                                   + lookAndFeel);
                System.err.println("Did you include the L&F library in the class path?");
                System.err.println("Using the default look and feel.");
            } 
            
            catch (UnsupportedLookAndFeelException e) {
                System.err.println("Can't use the specified look and feel ("
                                   + lookAndFeel
                                   + ") on this platform.");
                System.err.println("Using the default look and feel.");
            } 
            
            catch (Exception e) {
                System.err.println("Couldn't get specified look and feel ("
                                   + lookAndFeel
                                   + "), for some reason.");
                System.err.println("Using the default look and feel.");
                e.printStackTrace();
            }
        }
    }

    private static void createAndShowGUI() {
        //Set the look and feel.
        initLookAndFeel();

        //Make sure we have nice window decorations.
        JFrame.setDefaultLookAndFeelDecorated(true);

        //Create and set up the window.
        JFrame frame = new JFrame("SwingApplication");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        LookAndFeelDemo app = new LookAndFeelDemo();
        Component contents = app.createComponents();
        frame.getContentPane().add(contents, BorderLayout.CENTER);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event dispatch thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

Темы

Темы были представлены как способ легкого изменения цветов и шрифтов межплатформенного Java (Металл) Стиль. В примере программы, LookAndfeelDemo.java, вышеупомянутый, можно изменить тему Металла L&F, устанавливая THEME постоянный на строке 23 к одному из трех значений:

Ocean, то, который немного более мягок чем чистый Металлический взгляд, было темой значения по умолчанию для Металла (Java) L&F начиная с Java SE 5. Несмотря на его имя, DefaultMetal не тема значения по умолчанию для Металла (это было перед Java SE 5, который объясняет его имя). Test темой является тема, определенная в TestTheme.java, с которым следует скомпилировать LookAndfeelDemo.java. Поскольку это пишется, TestTheme.java устанавливает эти три основных цвета (с несколько причудливыми результатами). Можно изменить TestTheme.java чтобы протестировать любые цвета, Вам нравится.

Раздел кода, где тема устанавливается, находится, начинаясь на строке 92 из LookAndfeelDemo.java. Отметьте, что следует использовать Металл L&F, чтобы установить тему.

 if (LOOKANDFEEL.equals("Metal")) {
    if (THEME.equals("DefaultMetal"))
       MetalLookAndFeel.setCurrentTheme(new DefaultMetalTheme());
    else if (THEME.equals("Ocean"))
       MetalLookAndFeel.setCurrentTheme(new OceanTheme());
    else
       MetalLookAndFeel.setCurrentTheme(new TestTheme());
                     
    UIManager.setLookAndFeel(new MetalLookAndFeel()); 
 }      

Демонстрационная Программа SwingSet2

В Вашем JDK 6 установок есть a demo\jfc папка, которая содержит демонстрационную вызванную программу SwingSet2. Эта программа имеет графически богатый GUI и позволяет Вам изменять Стиль из меню. Далее, если Вы используете Java (Металл) Стиль, можно выбрать множество различных тем. Файлы для различных тем (например, RubyTheme.java) находятся в SwingSet2\src папка.

Это - "Океанская" тема, которая является значением по умолчанию для межплатформенного Java (Металл) Стиль:

Это - "Стальная" тема, которая была исходной темой для межплатформенного Java (Металл) Стиль:

Работать SwingSet2 демонстрационная программа на системе, которой устанавливали JDK, используйте эту команду:

java -jar SwingSet2.jar

Это даст Вам тему значения по умолчанию Океана.

Чтобы получить металл L&F, выполните это:

java -Dswing.metalTheme=steel -jar SwingSet2.jar

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Изменение Стили
Следующая страница: Стиль Синтезатора