Первые Java программы страдали бедностью интерфейсов. Более того, создание интерфейса, который запускался бы на любой платформе, часто было сложной задачей. Однако библиотека Swing изменила все. Благодаря Swing ваши приложения могут прекрасно выглядеть и прекрасно работать и под Windows, и под Linux, и на любой другой платформе.
Основы библиотеки
Swing это набор для создания богатого графического интерфейса пользователя (GUI) для ваших Java программ и апплетов. Он может быть подключен к JDK 1.1, как отдельная часть, и вошел в состав инструментария для Java2, начиная с JDK версии 1.2 и далее. В сравнении с ранее использовавшейся библиотекой AWT, библиотека Swing имеет ряд преимуществ. Однако мы остановимся на следующих четырех:
- богатый набор интерфейсных примитивов
- настраивающийся внешний вид на различных платформах (look and feel)
- раздельная архитектура модель-вид (model-view)
- встроенная поддержка HTML
И в конце мы рассмотрим простую программу для того, чтобы практически понять некоторые аспекты работы и использования элементов библиотеки Swing.
Окна, кнопки, всплывающие подсказки, таблицы и много другого
Создание сложного GUI при помощи AWT практически невозможно, поскольку в AWT нет основных интерфейсных примитивов. Swing же предоставляет этот набор и не только. Он также делает создание GUI более легким за счет применения набора настраиваемых границ (Borders) и менеджеров размещения (LayoutManagers).
Отметим, что практически все компоненты Swing начинаются с главенствующей буквы J (JFrame, JTable, JMenu). Названия всех компонентов очевидны, и сходны с теми, которые использовались в AWT. К примеру, если в AWT в роли окна верхнего уровня использовалось Frame, в Swing используется в аналогичной роли JFrame. Краткое описание некоторых важных элементов, которых не имела в своем активе AWT приведены ниже.
JInternalFrame | Окно, существующее внутри другого окна верхнего уровня, например в JFrame. |
JProgressBar | Строка, отображающая процесс проистечения какого-то события, например процесс загрузки. |
JSlider | «Ползунок», позволяющий пользователю выбирать предел отображения величин. |
JTable | Компонент, представляющий данные в виде таблиц. |
JTree | Компонент, представляющий данные в иерархическом виде. |
Интерфейс, настраивающийся под вашу платформу
Вторым преимуществом Swing является настраивающийся внешний вид ваших приложений (Look&Feel). Это значит, что внешний вид может динамически изменяться. Приложение может выглядеть как Windows , Unix, или Macintosh программа, либо же может иметь вид Java программы. Если важно, чтобы ваше приложение имело внешний вид программы той платформы, на которой работает, это преимущество Swing окажется очень кстати. Однако чаще всего предпочитают внешний вид Java программы (MetalLook&Feel), поскольку она выглядит на всех платформах хорошо.
На рис.1 представлены три скриншота одной и той же программы с различным Look&Feel. MetalLook&Feel обозначает внешний вид программы как Java-программы. Изменение внешнего вида программы делается достаточно просто, следующий отрывок кода демонстрирует это:
public static void main(String [] args) { //Установка Java Look and Feel (по умолчанию) try { UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) { } //остальная часть программы }
Другие аргументы, которые могут быть переданы методу setLookAndFeel():
- UIManager.getSystemLookAndFeelClassName() – внешний вид программы, сходной с программой той платформы, на которой приложение запускается.
- «com.sun.java.swing.plaf.windows.WindowsLookAndFeel» – внешний вид Win32 look and feel (только для Windows).
- «com.sun.java.swing.plaf.motif.MotifLookAndFeel» – вид Motif (Unix).
- «javax.swing.plaf.mac.MacLookAndFeel» — вид Macintosh look and feel (только для Mac).
Большинство Swing компонентов построено по модифицированной версии Модель-Вид-Контроллер (MVC).Это влечет за собой разделение между данными компонента(модель) и способа, которым пользователь видит и взаимодействует с ними (вид). К примеру, в приложении с таблицей, данные таблицы полностью независимы от интерфейса пользователя. Интерфейс пользователя может динамически изменяться, но вначале данные связываются с расположением колонок и столбцов, а затем с изображением. Если бы данные были привязаны к изображению – изменение внешнего вида (при подключении другого Look&Feel) было бы невозможным. Разделение модели и вида в Swing имеет ряд преимуществ. Одно из них заключается в возможности подключения различного Look&Feel. Другим важным преимуществом является возможность применить свою модель для компонента интерфейса. Например, вы можете создать модель представления таблицы, которая динамически получает колонки и строки данных и БД.
Встроенная поддержка HTML
Встроенная поддержка HTML позволяет легко изменить внешний вид компонента. Объявление кнопки обычно выглядит так: JButton myButton = new JButton(«OK»); Если вы хотите сделать надпись “ОК” немного больше и сделать ее красным цветом, вы можете использовать соответствующий HTML тэг: JButton myButton = new JButton («<html><b><font color=»red»>OK</font></b></html>»);
Все компоненты, в основе которых лежит текст, поддерживают HTML с версии Swing 1.1.1 (или JDK1.2.2). Однако это не полная поддержка HTML. Хотя ее вполне достаточно для просмотра простых web-страниц (имеется ввиду возможность создавать страницы размером в несколько сот строк кода). В некоторых приложениях возможно использовать небольшие help-броузеры, использующие теги HTML или HTML, смешанный с компонентами Swing.
Первая Swing программа
Даже простая Swing программа демонстрирует ряд важных концепций использования библиотеки. Рассмотрим небольшую программу, отображающую ваш текущий IP адрес.
Code Listing: CurrentIP.java import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.*; public class CurrentIP { public static void main(String [] args) { JFrame frame = new JFrame("Current IP"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); String IP = ""; try { IP = InetAddress.getLocalHost().getHostAddress(); } catch (Exception e) { IP = "Error finding IP"; } //Создается панель, //которая будет содржать информацию о IP адресе JPanel panel = new JPanel(); //добавление границы к панели panel.setBorder(BorderFactory.createTitledBorder(" Current IP Address")); panel.add(new JLabel(" " + IP + " ")); //Добавление панели к фрейму frame.getContentPane().add(panel); //метод рack(); сообщает Swing о том, //что нужно придать компонентам необходимые размеры для //правильного помещения их в форму. //Другой способ - вызвать setSize(int width, int height). frame.pack(); //Для того, чтобы увидеть окно на экране //вы должны вызвать метод setVisible(true) frame.setVisible(true); } }
Каждое Swing приложение должно использовать окно верхнего уровня. В большинстве случаев, как и в нашем примере, — это JFrame. Код после создания JFrame демонстрирует использование анонимного внутреннего класса. Нам нужны слушатели событий WindowListener или WindowAdapter для принятия событий, когда пользователь пытается закрыть окно кнопкой управления окна (крестик в правом верхнем углу). Мы могли бы написать отдельный класс, который расширял бы WindowAdapter или наследовал бы интерфейс WindowListener для закрытия окна. Но это была бы значительная часть кода, который бы выполнял такую небольшую задачу. Рациональнее в данном случае создать внутренний класс, который расширяет WindowAdapter или наследует WindowListener. Однако самым легким решением является создание внутреннего класса, который расширяет WindowAdapter и переопределяет метод windowClosing, как сделано в нашем примере. Если вы посмотрите на код, то увидите, что мы просто определяем тело безымянного класса внутри вызова метода addWindowListener. Ис пользование внутренних анонимных классов является самым простым, легким и эффективным решением для прослушивания многих событий в вашем приложении.
Остальная часть приложения тривиальна. Мы используем класс InetAddress для определения адреса IP, затем добавляем эту информацию к JPanel. После добавления Jpanel к нашему JFrame, мы вызывает методы pack() и setVisible(true). Эти методы должны вызываться только после того, как все элементы были добавлены к JPanel.
Заключение.
Мы познакомились только с основными из достоинств библиотеки Swing и рассмотрели небольшую программу. Swing представляет еще огромное множество возможностей, и если вас привлекает ее элегантность и функциональность – вы обязательно изучите Swing более подробно.
Автор: Matt Tucker
Computer Science University of Iowa.
Article original location: www.acm.org/crossroads/xrds6-4/ovp64.html