Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на Java часть 2

.pdf
Скачиваний:
134
Добавлен:
16.03.2016
Размер:
3.07 Mб
Скачать

}

}

В результате выполнения данной программы получим: Вывод текущего состояния таблицы

id name

1user1

2user2

3user3

Вывод таблицы после добавления нескольких объектов id name

1user1

2user2

3user3

4user4

5user5

6user6

Вывод таблицы после добавления массива объектов id name

1user1

2user2

3user3

4user4

5user5

6new_user6

7user7

8user8

9user9

Вывод таблицы после удаления массива объектов id name

1user1

2user2

3user3

4user4

5user5

6new_user6

61

ГЛАВА 3 SWING И ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС

Тема 3.1 Общие сведения о swing

Практически каждое приложение можно разделить на две части. Первая это код, выполняющий те действия, для которых и была написана программа, например копирование файла, формирование запроса к базе данных, оформление заказа или финансовые вычисления. Вторая часть – это интерфейс, который определяет порядок взаимодействия пользователя с программой. Действия, выполняемые приложением, безусловно важны. Но нельзя недооценивать также значение пользовательского интерфейса, который не только задает внешний вид программы, но часто также определяет, насколько успешным будет данный продукт на рынке. Таким образом, создание привлекательных, согласованных и эффективных пользовательских интерфейсов –неотъемлемая часть процесса разработки программ. Для программистов, применяющих язык Java, путь к созданию высококачественных интерфейсов –это использование Swing.

Swing представляет собой набор классов, применяемых для создания графических пользовательских интерфейсов (Graphical User Interface – GUI) современных приложений, в том числе Web-программ. Swing предоставляет богатый набор визуальных компонентов, например, кнопок, полей редактирования, полос прокрутки, флажков опций и таблиц, разработанных так, чтобы их можно было успешно применять в самых различных приложениях. Посредством Swing можно разработать интерфейс приложения на профессиональном уровне, наилучшим образом удовлетворяющий потребностям пользователей. Более того, трудно представить профессионального программиста, не владеющего Swing.

В ранних версиях Java средства Swing еще отсутствовали. Можно считать, что они стали попыткой преодолеть трудности, связанные с использованием первой оконной подсистемы AWT (Abstract Window Toolkit). В AWT был определен базовый набор управляющих элементов и окон, позволяющий создавать графические интерфейсы, правда, с ограниченными возможностями. Одним из ограничений AWT была платформенноориентированная поддержка визуальных компонентов. В результате внешний вид интерфейсных элементов определялся не средствами Java, а используемой платформой. Элементы, создаваемые средствам AWT, назывались тяжеловесными.

Платформенно-ориентированная поддержка интерфейсных элементов стала источником ряда проблем. Во-первых, из-за различия в операционных системах компоненты по-разному выглядели и даже по-разному вели себя на различных платформах. Это было прямым нарушением главного принципа Java: код, единожды написанный, должен работать везде. Во-вторых, внешний вид каждого компонента был фиксированным, и изменить его было достаточно трудно (причина та же – платформенно-ориентированные средства поддержки). В-третьих, использование тяжеловесных компонентов

62

порождало ряд проблем, например, такие компоненты всегда имели прямоугольную форму и были непрозрачны.

Потребовалось не слишком много времени, чтобы осознать, что ограничения AWT слишком серьезны и нужен новый подход. В результате в 1997 г. появился набор Swing. Он был включен в состав JFS (Java Foundation Classes). JFC – это набор классов, обеспечивающих базовую поддержку корпоративных приложений с пользовательским интерфейсом. Другими компонентами JFC являются AWT (AbstractWindow Toolkit), Java 2D, Drag и Drop и Accessibility API. Первоначально Swing использовался в Java 1.1 как отдельная библиотека. Однако в Java 1.2 средства Swing(как и остальные элементы JFS) были полностью интегрированы в Java. В настоящее время Swing – неотъемлемая часть данного языка.

Как уже было сказано, набор Swing был создан для того, чтобы преодолеть ограничения, связанные с AWT. Для достижения этой цели разработчики реализовали два подхода: легковесные компоненты и настраиваемые стили. Совместно эти решения позволили создать элегантный и простой в использовании инструмент, свободный от недостатков AWT. Легковесные компоненты и настраиваемые стили считаются основными свойствами Swing.

Все компоненты Swing, за небольшим исключением, являются легковесными. Это означает, что они написаны полностью на Java и не зависят от средств той платформы, на которой выполняется программа. Поскольку при воспроизведении легковесных компонентов используются графические примитивы, они могут иметь форму, отличную от прямоугольной. Следовательно, такие компоненты являются более эффективными и гибкими. Поскольку легковесные компоненты не преобразуются в платформенно-ориентированные элементы, их внешний вид определяет Swing, а не операционная система. Следовательно, интерфейсные элементы, созданные с помощью Swing, выглядят одинаково на разных платформах.

Swing поддерживает настраиваемые стили. Поскольку каждый компонент воспроизводится с помощью Java-кода, его внешний вид полностью контролируется средствами Swing. Это означает, что внешний вид компонента можно отделить от логики его работы; эта возможность реализована в Swing. Такое разделение позволяет изменить внешний вид компонента, не затрагивая других его характеристик. Другими словами, появляется возможность перенастроить внешний вид, Не создавая побочных эффектов в коде, использующем компонент. Более того, можно также создавать глобальные стили, определяющие, как будет выглядеть интерфейс в целом. При переключении стиля внешний вид всех элементов изменяется автоматически.

Настраиваемые стили создают ряд преимуществ. Становится возможным обеспечить один и тот же внешний вид окна программы на разных платформах. С другой стороны, можно также настроить программу таким образом, что ее интерфейс будет соответствовать той или иной

63

конкретной платформе. Например, если вы знаете, что ваша программа будет выполняться только в среде Windows, вы можете задать для нее внешний вид, соответствующий остальным программам, работающим в данной системе. Можно также сформировать свой стиль, отличающийся от стилей известных платформ. И наконец, есть возможность динамически изменять внешний вид программы в процессе ее работы.

Каждому пользователю Swing изначально доступны разные стили, например: metal, Windows и др. Стиль metal также называют стилем Java. Это платформенно-независимый стиль, доступный во всех средах выполнения Java-программ. Он принимается по умолчанию. Существует также стиль Mac, доступный в системе Mac, и стиль GTK+, который можно использовать на платформах Mac и Solaris. В данной книге используется стиль Java. Такой выбор сделан потому, что данный стиль доступен на всех платформах. Однако никто не мешает вам при желании экспериментировать с другими стилями и даже создавать свои.

Перед тем как продолжить наш разговор, необходимо отметить одну очень важную деталь. Несмотря на то что Swing устраняет ряд ограничений, присущих AWT, он не заменяет данный инструмент. Более того, в основу Swing положены некоторые основные решения, принятые в AWT. В частности, в Swing используется такой же механизм обработки событий, как и в AWT. Поэтому желательно понимать структуру библиотеки AWT и ее возможности. Этим вы упростите для себя восприятие Swing.

Тема 3.2 Архитектура MVC

Визуальный компонент можно представить себе как элемент, сочетающий следующие характеристики.

Способ отображения на экране.

Реакция на действия пользователя.

Информация, связанная с данным компонентом.

Этими тремя характеристиками компонент обладает независимо от того, какая архитектура использовалась при его создании, тем не менее одна из архитектур с честью выдержала испытания временем и доказала свою эффективность. Это архитектура "модель-представление-контроллер" (MVC

–Model-View-Controller).

Преимущество данной архитектуры состоит в том, что каждая ее составляющая в точности соответствует одной из характеристик компонента. Модель задает состояние компонента. Например, для флажка опций модель содержит признак того, установлен или сброшен флажок. Представление определяет, как компонент будет отображаться на экране, в том числе как будет представлено текущее состояние модели. Контроллер обеспечивает реакцию компонента на действия пользователя. Например, когда пользователь щелкает на флажке опций, реакцией контроллера является изменение модели (установка сброшенного флажка или сброс установленного). Кроме того, в ответ на действия пользователя обновляется

64

представление. Разделяя компонент на модель, представление и контроллер, можно добиться того, что реализация одной части не будет оказывать влияния на остальные две. Например, разные представления могут отображать один и тот же компонент разными способами; при этом модель и контроллер остаются неизменными.

Несмотря на то что принципы архитектуры MVC выглядят очень привлекательно, в случае компонентов Swing разделение функций представления и контроллера не дает ощутимых преимуществ. Поэтому в Swing используется модифицированный вариант MVC, в котором представление и контроллер объединены в единый элемент, называемый представителем пользовательского интерфейса. Подход, используемый в Swing, известен как архитектура "модель-представитель" или архитектура с выделенной моделью. Таким образом, несмотря на то, что компоненты Swing похожи на MVC, их нельзя рассматривать как классическую реализацию данной архитектуры.

Настраиваемые стили Swing стали возможными благодаря использованию архитектуры "модель-представитель". Поскольку представление и контроллер отделены от модели, их можно заменить, не затрагивая механизмов взаимодействия компонентов с программой: С другой стороны, модель можно модифицировать, не изменяя при этом внешний вид элемента и его реакцию на действия пользователя.

Поддержка архитектуры "модель-представитель" обусловливает наличие компонентах Swing двух объектов. Первый из них представляет модель, второй соответствует представителю пользовательского интерфейса. Модели определяются посредством интерфейсов, например, модель для кнопки определена с помощью интерфейса ButtonModel, Представителями пользовательского интерфейса являются подклассы ComponentUI. Например, в роли представителя для кнопки выступает объект ButtonUI. В обычных условиях программа не взаимодействует с представителем интерфейса.

Тема 3.3 Контейнер и компоненты

В состав графического пользовательского интерфейса, созданного средствами Swing, входят элементы двух типов: компоненты и контейнеры. Такое разделение во многом условно, так как контейнеры являются в то же время и компонентами. Различие между ними в их назначении. Компоненты

– это независимые элементы, в качестве примеров которых можно привести кнопки или линейные регуляторы. Контейнер может содержать в себе несколько компонентов и представляет собой специальный тип компонента. Чтобы компонент отобразился на экране, его надо поместить в контейнер. Таким образом, в составе графического пользовательского интерфейса должен присутствовать хотя бы один контейнер. Поскольку контейнеры являются компонентами, один контейнер может находиться в составе другого. Это позволяет формировать так называемую иерархию контейнеров, на вершине которой должен находиться контейнер верхнего уровня.

65

Подавляющее большинство компонентов Swing создается с помощью классов, являющихся потомками класса JComponent. Класс JComponent реализует функциональные модификация данной модели, называемая архитектурой "модель-представитель" или архитектурой с выделенной моделью.

Классы, представляющие все компоненты Swing, содержатся в пакете javax.swing. В таблице 3.1 приведены имена классов для компонентов Swing.

Таблица 3.1 Компоненты Swing

Компонент

Назначение компонента

JLabel

"Метка" – вывод однострочного

 

неформатированного текста

JButton

"Кнопка" – кнопка с текстом и/или с картинкой

JToggleButton

"Защелкивающаяся кнопка" – кнопка с

 

фиксацией. Может быть одной из нескольких таких

 

кнопок в группе, в этом случае нажатие одной

 

кнопки вызывает отпускание другой. Работа группы

 

обеспечивается компонентом ButtonGroup, который

 

должен быть перетащен на форму, а затем назначен

 

свойству buttonGroup.

JCheckBox

"Чекбокс" – пункт выбора с независимой

 

фиксацией.

JRadioButton

"Радиокнопка" – пункт выбора с зависимой

 

фиксацией, должен быть одним из нескольких в

 

группе. Работа группы обеспечивается компонентом

 

ButtonGroup.

ButtonGroup

Обеспечивает работу групп компонентов

 

JToggleButton или JradioButton.

JComboBox

"Комбобокс" – выпадающий список.

JList

Прокручивающийся список.

JTextField

"Текстовое поле" – однострочный пункт ввода и

 

редактирования текста.

JTextArea

"Текстовая область" – многострочный пункт

 

ввода и редактирования текста.

JPanel

"Панель" – группирующий компонент,

 

позволяющий располагать на себе другие

 

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

 

вместе с ней все расположенные на ней компоненты.

 

По умолчанию свойство layout ("размещение")

 

установлено как FlowLayout –"в виде потока". Для

 

простых задач вместо этого компонента лучше

 

использовать JLayeredPane.

JTabbedPane

"Панель с закладками" –каждый положенный на

 

нее компонент показывается в отдельной закладке.

 

66

 

Чтобы разместить на одной закладке несколько

 

компонентов, сначала положите на панель с

 

закладками обычную панель. Для того, чтобы

 

создать последующие закладки, выделите панель с

 

закладками, вызовите правой кнопкой мыши

 

всплывающее меню, пункт Add From Palette

 

("добавить из палитры"), и добавьте еще одну панель

 

или другой компонент.

JScrollBar

Независимая полоса прокрутки. Используется

 

редко – для программно управляемой прокрутки

 

содержимого компонентов, для которых отсутствуют

 

встроенные полосы прокрутки.

JScrollPane

"Панель с полосами прокрутки"

JMenuBar

"Меню формы" – предназначено для

 

расположения в нем компонентов типа JMenu

 

(заголовков меню).

JPopupMenu

"Всплывающее меню" – предназначено для

 

расположения в нем компонентов типа JMenuItem

 

(пунктов меню).

JSlider

"Ползунок". Используется для плавной

 

регулировки числовых величин, а также связанных с

 

ними программно регулируемых изменений.

JProgressBar

"Прогрессбар" – полоса показа доли выполнения

 

задачи. Показывает уровень, отражающий долю

 

выполнения задачи

JSplitPane

"Панель с разделителем" – панель, состоящая из

 

двух частей, между которыми имеется линия

 

разделителя, которую можно перетаскивать мышью,

 

меняя взаимный размер частей.

JFormattedTextField

"Поле ввода форматированного текста"

JPasswordField

"Поле ввода пароля" – вводимый текст

 

отображается звездочками.

JSpinner

"Спиннер" – поле ввода числа с кнопками

 

увеличения/уменьшения.

JSeparator

"Сепаратор" – разделительная линия.

 

Используется в декоративных целях для разделения

 

рабочих областей формы и других группирующих

 

компонентов.

JTextPane

"Текстовая панель". По умолчанию

 

автоматически переносит текст на новую строку. А

 

не располагает в одну строку с показом

 

горизонтального скроллера, как это делает JTextArea.

JEditorPane

"Панель текстового редактора"

JTree

"Дерево" – показывает дерево, в котором каждая

 

67

 

ветвь может быть с иконками и текстом, а узлы

 

разворачиваются и сворачиваются.

JTable

"Таблица" – показ текстовой таблицы. Имеет

 

возможность заполнения значениями по умолчанию

 

на этапе проектирования.

JToolBar

"Тулбар" – панель инструментов. Обычно на

 

нем размещают кнопки JToggleButton, для которых

 

назначены иконки.

JInternalFrame

"Дочернее окно" – окно многооконного

 

приложения. Его можно перемещать в пределах

 

родительского окна – главного окна приложения. В

 

настоящее время такой стиль приложений

 

практически не используется.

JLayeredPane

"Панель с абсолютным позиционированием

 

элементов"

JDesktopPane

"Панель – рабочий стол". Еще один тип панели с

 

абсолютным позиционированием элементов.

JOptionPane

"Диалоговая панель" – предназначена для показа

 

диалоговых форм. В отличие от большинства других

 

компонентов работа идет с помощью методов класса.

 

Имеются вызовы диалогов:

 

С сообщением:

 

 

javax.swing.JOptionPane.showMessageDialog(n

 

ull, "Кнопку нажали");

 

 

JOptionPane.showMessageDialog(null,"Привет!

 

", "Заголовок сообщения",

 

JOptionPane.INFORMATION_MESSAGE);

 

С подтверждением:

 

int option=

 

javax.swing.JOptionPane.showConfirmDialog(null,"Про

 

должить?");

 

Проверка, какую кнопку нажали или диалог

 

закрыли без осуществления выбора, осуществляется

 

сравнением с константами

 

javax.swing.JOptionPane.NO_OPTION,

 

CANCEL_OPTION, CLOSED_OPTION,

 

OK_OPTION, YES_OPTION

 

С предложением ввести значение:

 

String

 

input=javax.swing.JOptionPane.showInputDialog(null,"

 

Введите значение:");

 

– при отказе от ввода возвращается null.

 

Первый параметр – имя формы, в которой

 

показывается диалог. Если он null – используется

 

форма по умолчанию (главная форма приложения).

 

 

68

 

Существуют варианты указанных выше

 

методов, позволяющие при вызове задавать

 

дополнительные параметры диалога (заголовок,

 

надписи на кнопках и др.).

JColorChooser

"Диалог выбора цвета" – предназначен для

 

выбора пользователем цвета.

JFileChooser

"Диалог выбора файла" – предназначен для

 

выбора пользователем файлов. Перед

 

использованием требуется положить его на какую-

 

нибудь диалоговую форму ( JDialog, JFrame ) или

 

какой-нибудь группирующий компонент формы.

JFrame

"Экранная форма". Показывается вызовом вида

 

jFrame1.setVisible(true) ;

JDialog

"Диалоговая форма". Показывается вызовом

 

вида jDialog1.setVisible(true) ;

ВSwing определены два типа контейнеров. К первому типу относятся контейнеры верхнего уровня: JFrame, JApplet, JWindow и JDialog. Они не принадлежат к числу подклассов JComponent, но тем не менее являются потомками Component и Container. В отличие от других компонентов Swing; контейнеры верхнего уровня являются тяжеловесными. По этим причинам контейнеры верхнего уровня составляют специальную группу в наборе

Swing.

Как следует из названия, контейнер верхнего уровня должен находиться на вершине иерархии. Он не может включаться в состав других контейнеров. Более того, любая иерархия должна начинаться именно с контейнера верхнего уровня. В приложениях для этой цели чаще всего используется объект JFrame, в аплетах – JApplet.

Контейнеры второго типа – это легковесные контейнеры, являющиеся потомками JComponent. В качестве примеров легковесных контейнеров можно привести JPanel и JRootPane. Легковесные контейнеры могут включаться в другие контейнеры, поэтому они часто используются для объединения группы связанных друг с другом компонентов.

Вкаждом контейнере верхнего уровня реализован набор панелей. На вершине иерархии находится корневая панель, т.е. экземпляр класса JRootPane. Это легковесный контейнер, цель которого – управление другими панелями и, при необходимости, полосой меню. Корневая панель включает в себя "стеклянную" панель (glass pane), панель содержимого (content pane) и

панель слоя (layered pane).

"Стеклянная" панель – это панель верхнего уровня, которая расположена поверх остальных панелей. По умолчанию "стеклянная" панель представляет собой "прозрачный экземпляр" JPanel. "Стеклянная" панель позволяет управлять событиями мыши, относящимися ко всему контейнеру, а не к содержащимся в нем компонентам. Она также обеспечивает рисование

69

компонентов. В большинстве случаев необходимость непосредственного взаимодействия со "стеклянной" панелью не возникает.

Панель слоя представляет собой экземпляр класса JLayeredPane. Она поддерживает "третье измерение" для компонентов, т.е. определяет правила перекрытия одних компонентов другими. (Панель слоя позволяет задавать Z- расположение компонента, однако эта возможность используется сравнительно редко.) В составе панели слоя находится панель содержимого и может также находиться строка меню.

Несмотря на то что "стеклянная" панель и панель слоя – неотъемлемые части контейнера верхнего уровня и выполняют важные функции, их действия большей частью скрыты не только от пользователей, но и от разработчиков. Приложение в основном взаимодействует с панелью содержимого, так как именно в нее включаются визуальные компоненты. Другими словами, добавляя компонент, например кнопку, к контейнеру верхнего уровня, вы на самом деле добавляете его к панели содержимого. По умолчанию панель содержимого представляет собой "непрозрачный экземпляр" JPanel.

Для обращения к "стеклянной" панели, панели содержимого и панели слоя в JRootPane предусмотрены переменные glassPane, contentPane и layeredPane.

Тема 3.4 Простая программа, использующая средства Swing

Перед тем как продолжить обсуждение теоретических вопросов, желательно рассмотреть в качестве примера простую программу, созданную с использованием средств Swing. Несмотря на простоту, данная программа демонстрирует ключевые свойства Swing и дает представление о контейнере JFrame и компоненте JLabel. Как было сказано ранее, JFrame – это контейнер верхнего уровня, обычно используемый в приложениях Swing. JLabel – компонент Swing, с помощью которого создается метка, используемая для представления информации. Метка – самый простой компонент Swing, поскольку он не реагирует на действия пользователя, а лишь отображает данные. В данной программе создается контейнер JFrame, в который помещается экземпляр компонента JLabel, отображающий текстовое сообщение.

Листинг 3.1

import javax.swing.JFrame; import javax.swing.JLabel; public class MyFrame {

public MyFrame() { //создание фрейма

JFrame fr = new JFrame("Заголовок");

//установка размеров фрейма fr.setSize(200, 100);

// создание метки

70