Spec-Zone .ru
спецификации, руководства, описания, API
|
Архитектура 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:
CrossPlatformLookAndFeel
— это - "Java L&F" (также названный "Металлом"), который выглядит одинаково на всех платформах. Это - часть API Java (javax.swing.plaf.metal
) и значение по умолчанию, которое будет использоваться, если Вы ничего не сделаете в своем коде, чтобы установить различное L&F.
SystemLookAndFeel
— здесь, приложение использует L&F, который является собственным к системе, на которой оно работает. Система L&F определяется во времени выполнения, где приложение просит, чтобы система возвратила имя соответствующего L&F.
Синтезатор — основание для того, чтобы создать Ваш собственный стиль с XML-файлом.
Мультиплексирование — способ иметь делегата методов 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
.
У всего Sun L&Fs есть много общности. Эта общность определяется в Basic
стиль в API (javax.swing.plaf.basic
). Мотив и Windows L&Fs каждый создаются, расширяя классы делегата UI в javax.swing.plaf.basic
(пользовательское L&F может быть создано, делая ту же самую вещь). "Основное" L&F не используется без того, чтобы быть расширенным.
В API Вы будете видеть четыре L&F пакеты:
javax.swing.plaf.basic
— основные Делегаты UI, которые будут расширены, создавая пользовательское L&F
javax.swing.plaf.metal
— Java L&F, также известный как CrossPlatform L&F ("Металл" был названием проекта Sun для этого L&F) текущее значение по умолчанию "тема" (обсужденный ниже) для этого L&F является "Океаном, таким образом, это часто упоминается как Океан L&F.
javax.swing.plaf.multi
— стиль мультиплексирования, который позволяет методам UI делегировать ко многим реализациям стили одновременно. Это может использоваться, чтобы увеличить поведение определенного стили, например с L&F, который обеспечивает аудио сигналы сверху стили Windows. Это - способ создать затрудненный - доступный стиль.
javax.swing.plaf.synth
— легко сконфигурированный L&F использующий XML-файлы (обсужденный в следующем разделе этого урока)
Вы не ограничиваетесь L&Fs предоставленный платформой Java. Можно использовать любого L&F, который находится в пути class Вашей программы. Внешний L&Fs обычно обеспечиваются в одном или более файлах JAR, которые Вы добавляете к пути class своей программы во времени выполнения. Например:
java -classpath .;C:\java\lafdir\customlaf.jar YourSwingApplication
Как только внешнее L&F находится в пути class Вашей программы, Ваша программа может использовать его точно так же как любой из L&Fs поставленный с платформой Java.
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
Еще один способ определить ток 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 должен установить L&F:
swing.defaultlaf
свойство. Если свойство определяется в обоих swing.properties
файл и на командной строке, определение командной строки имеет приоритет.Можно измениться 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 к одному из трех значений:
DefaultMetal
Ocean
Test
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()); }
В Вашем 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