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

Портянкин И. Swing

.pdf
Скачиваний:
210
Добавлен:
07.10.2020
Размер:
5 Мб
Скачать
☆

Управление пространством

405

страивает свои полосы прокрутки панель прокрутки JScrollPane. Числа для модели она либо выбирает по умолчанию (в зависимости от своих размеров и размеров прокручиваемого компонента), либо с помощью методов интерфейса Scrollable, если прокручиваемый компонент его реализует. В следующем примере мы проверим полосы прокрутки

вдействии:

//Scrollbars.java

//Полосы прокрутки JScrollBar import javax.swing.*;

import java.awt.*;

public class Scrollbars extends JFrame { public Scrollbars() {

super("Scrollbars"); setDefaultCloseOperation(EXIT_ON_CLOSE);

//создаем стандартную модель

BoundedRangeModel model =

new DefaultBoundedRangeModel(10, 40, 0, 100);

//пара полос прокрутки

JScrollBar scrollbar1 = new JScrollBar(

JScrollBar.HORIZONTAL);

JScrollBar scrollbar2 = new JScrollBar(

JScrollBar.VERTICAL);

//присоединяем модель scrollbar1.setModel(model); scrollbar2.setModel(model);

//добавляем компоненты add(scrollbar1, "South"); add(scrollbar2, "East");

//выводим окно на экран setSize(400, 300); setVisible(true);

}

public static void main(String[] args) { SwingUtilities.invokeLater(

new Runnable() {

public void run() { new Scrollbars(); } });

}

}

Здесь мы создаем пару полос прокрутки JScrollBar, одна из них будет горизонтальной, вторая — вертикальной. Данные для обеих полос будет поставлять стандартная модель DefaultBoundedRangeModel. Обратите внимание на ее значения: текущее значение равно 10, внутренний диапазон велик и равен 40 (как вы помните, внутренний диапазон отвечает за величину полосы прокрутки), а минимальное и максимальное значения равны

406

ГЛАВА 13

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

Созданные полосы добавляются в окно, горизонтальная — на юг, вертикальная — на восток окна. Запустив программу с примером, вы увидите синхронную работу полос, связанных одной моделью, и оцените размер полосы, заданный большим внутренним диапазоном. Размер полосы, как можно видеть из изображения, относительный, и зависит от размера всей полосы прокрутки, то есть от внутреннего диапазона относительно всего диапазона модели.

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

Резюме

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

Глава 14. Стандартные диалоговые окна

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

Библиотека Swing не является исключением из общего правила — в ней представлен богатый выбор стандартных диалоговых окон, намного упрощающих и ускоряющих вывод простой информации и выбор наиболее часто встречающихся в графических приложениях форматов данных. Для вывода разнообразной полезной информации (как правило, сообщений о работе программы, ошибках и нестандартных ситуациях) и ввода несложных данных предназначен класс JOptionPane, частый «гость» любого приложения, созданного средствами Swing. Работа с ним обычно заключается в вызове одного из многочисленных статических методов, создающих и выводящих на экран модальное диалоговое окно стандартного вида (который определяется текущим менеджером внешнего вида и поведения). В таких диалоговых окнах вы можете выводить самую разнообразную информацию и при необходимости размещать в них дополнительные компоненты, тонко настраивая все аспекты их поведения и внешнего вида. С другой стороны, класс JOptionPane представляет собой просто еще один компонент, унаследованный от базового класса JComponent библиотеки Swing, так что вы можете работать с ним напрямую, как мы это делали с остальными компонентами Swing: создавать экземпляры класса JOptionPane и настраивать их свойства. С настроенным компонентом JOptionPane дальше можно поступать по-разному: размещать его в каких-либо контейнерах своего приложения или с помощью вспомогательных методов быстро выводить его в диалоговом окне подходящего вида.

Подавляющее большинство графических приложений так или иначе работают с файлами, даже если манипуляция файлами не входит в сферу их основных обязанностей. Поэтому наличие в Swing мощного средства для удобного выбора файлов — компонента JFileChooser — приходится весьма кстати. Как и в случае с классом JOptionPane, компонент JFileChooser, хотя и представляет собой обычный компонент (а точнее контейнер, в котором расположены несколько компонентов, списков и кнопок, «ведающих» выбором файлов), чаще всего выводится на экран с помощью легко настраиваемого модального диалогового окна. Компонент JFileChooser вы можете добавить в любое место своего пользовательского интерфейса. Он весьма гибок и позволит вам до мелочей настраивать внешний вид. При необходимости можно полностью изменить стандартное расположение входящих в него компонентов и добавить дополнительные элементы, такие как панели предварительного просмотра файлов. Сказанное о компоненте JFileChooser в полной мере относится и к компоненту JColorChooser, который, с одной стороны, «одним мановением руки» позволяет организовать удобный и наглядный выбор цвета в модальном

408

ГЛАВА 14

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

У всех стандартных диалоговых окон Swing есть собственные UI-представители, которые отвечают за то, чтобы диалоговые окна выглядели подобающим образом в используемом приложением внешнем виде. Это особенно важно для внешних видов, имитирующих известные платформы, пользователи которых не должны ощущать разницы (по крайней мере, значительной) при переходе от «родных» приложений к Javaприложениям. Этому прекрасно служат стандартные диалоговые окна, хорошо известные пользователям .

Многоликий класс JOptionPane

С помощью одного только класса JOptionPane уже можно «состряпать» приличное приложение, настолько он разнообразен и столько всяческих операций по сбору и выводу данных позволяет проводить. Мы уже поняли, что JOptionPane представляет собой обычный компонент Swing, и работать с ним можно так же, как с другими компонентами, настроив и добавив в подходящее место своего контейнера. Выглядит экземпляр класса JOptionPane, даже настроенный самым экзотичным образом, всегда примерно так, как показано на рис. 14.1 (хотя значок может отсутствовать).

Область вывода сообщения и ввода данных

Значок

Командные кнопки

Рис. 14.1. Стандартное диалоговое окно

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

Вывод сообщений

Перегруженные статические методы с общим именем showMessageDialog() позволяют быстро сообщить пользователю некоторую информацию, как правило, довольно важную (модальное диалоговое окно подразумевает, что информация заслуживает хоть какого-то внимания пользователя, потому что приостанавливает работу основного окна приложения). Рассмотрим пример использования таких методов, а потом обсудим их подробнее:

1 По поводу модальных окон идут жаркие споры, и чрезмерное их использование действительно раздражает, так как они полностью блокируют основное окно приложения, а значит, отрывают пользователя от важных дел. Однако для действительно важных сообщений или вопросов модальные окна по-прежнему хороши.

Стандартные диалоговые окна

409

//MessageDialogs.java

//Методы JOptionPane для вывода соообщений import javax.swing.*;

import java.awt.event.*; import java.awt.*;

public class MessageDialogs extends JFrame { // этот значок выведем в одном из сообщений

private ImageIcon icon = new ImageIcon("question.gif"); public MessageDialogs() {

super("MessageDialogs"); setDefaultCloseOperation(EXIT_ON_CLOSE);

//кнопки, после щелчков на которых

//выводятся сообщения

JButton message1 = new JButton("2 параметра"); message1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(

MessageDialogs.this, "<html><h2>Привет!<br>HTML есть и здесь!");

}

});

JButton message2 = new JButton("4 параметра"); message2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(

MessageDialogs.this,new String[] { "Сообщение может быть", "записано массивом!" }, "Свой заголовок", JOptionPane.ERROR_MESSAGE);

}

});

JButton message3 = new JButton("5 параметров"); message3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

JOptionPane.showMessageDialog(

MessageDialogs.this,

"Настроено все что можно", "Свой заголовок", JOptionPane.INFORMATION_MESSAGE, icon);

}

});

410

ГЛАВА 14

// выведем окно на экран setLayout(new FlowLayout()); add(message1); add(message2); add(message3);

setSize(400, 200); setVisible(true);

}

public static void main(String[] args) { SwingUtilities.invokeLater(

new Runnable() {

public void run() { new MessageDialogs(); } });

}

}

В примере мы создаем небольшое окно, в котором разместятся три кнопки JButton. После щелчка на каждой из них вашему взору будет представлен соответствующий вариант стандартного диалогового окна с некоторым сообщением. Первая кнопка демонстрирует минималистский способ вывода сообщений: все, что здесь требуется методу showMessageDialog() — это сослаться на «родительский» компонент (которым может быть любое окно, унаследованное от класса Window2) и показать собственно сам объектсообщение. В качестве сообщения для первого диалогового окна мы использовали строку в формате HTML (начав ее с «волшебных» символов <html>). Запустив программу с примером, вы сможете убедиться в том, что стандартные диалоговые окна прекрасно знакомы с HTML. Это неудивительно: если вы передаете стандартному диалоговому окну строку, для вывода ее на экран оно использует нашу «старую знакомую», надпись JLabel, а уж о ее знании HTML нам прекрасно известно.

Второй вызов метода showMessageDialog() демонстрирует, как можно точнее настроить стандартное диалоговое окно. Первые два параметра не меняются — это все те же родительский компонент и сообщение, а вот следующие два параметра позволяют задать заголовок стандартного диалогового окна и его тип. Поддерживаемые классом JOptionPane типы стандартных диалоговых окон описаны в нем несколькими константами (табл. 14.1).

Таблица 14.1. Типы стандартных диалоговых окон

Тип диалогового окна Описание

INFORMATION_ Этостандартноедиалоговоеокновыводитинформациюобщегоназначения.

MESSAGE Диалоговое окно именно такого типа создает метод showMessageDialog()

с двумя параметрами. Все стандартные диалоговые окна, относящиеся

к данному типу, выводятся на экран со значком соответствующего вида

WARNING_MESSAGE Стандартное диалоговое окно такого типа выводит на экран предупреждающую информацию. Также снабжается соответствующим значком

2 В качестве родительского компонента можно использовать любой унаследованный от базового класса Component графический компонент, по центру этого компонента диалоговое окно и будет выведено на экран. Просто чаще всего таким компонентом является ссылка на главное окно приложения, так что все сообщения выводятся по центру окна, где пользователю работать с ними удобнее всего. Вы можете передать в метод пустую (null) ссылку, в таком случае диалоговое окно окажется в центре рабочего стола пользователя.

Стандартные диалоговые окна

411

Таблица 14.1 (продолжение)

Тип диалогового окна Описание

QUESTION_MESSAGE

Это стандартное диалоговое окно для запроса информации от пользо-

 

вателя (мы его вскоре рассмотрим). Как правило, не используется для

 

информационных сообщений

ERROR_MESSAGE

Это диалоговое окно выводит на экран информацию об ошибке. Тоже

 

имеет свой значок, чаще всего довольно «грозного» вида

PLAIN_MESSAGE

Указывает, что диалоговое окно не принадлежит ни к одному из вышепе-

 

речисленных типов. Выводится на экран без стандартного значка

В нашем примере для второго диалогового окна мы использовали тип ERROR_ MESSAGE, так что вы сможете увидеть, как выглядят на экране стандартные диалоговые окна с сообщениями об ошибках. Заголовок диалогового окна задается обычной строкой, а вот в качестве сообщения мы указали кое-что необычное — массив строк. Запустив программу с примером, вы увидите, что класс JOptionPane с массивом прекрасно справляется, выводя его содержимое на экран в несколько рядов. Благодаря поддержке массивов вы сможете методом showMessageDialog()выводить самые пространные сообщения, используя при необходимости в некоторых из них язык HTML.

Наконец, третий вариант метода showMessageDialog() показывает, как можно настроить все элементы стандартного диалогового окна для вывода сообщений. Первые четыре параметра неизменны — это родительский компонент, сообщение, заголовок и тип диалогового окна, а вот пятым идет значок Icon, который появится на месте стандартного значка. Если вы задаете такой значок (а мы в примере так и делаем), тип диалогового окна уже не так важен: ведь он отвечает только за значок, а мы его меняем3. После запуска программы с примером вы сможете увидеть, как окно, выведенное самым пространным вариантом метода showMessageDialog(), выглядит на экране.

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

412

ГЛАВА 14

Мы уже познакомились с тем, как в качестве сообщений используются строки и массивы строк, но оказывается, это еще не все способности класса JOptionPane. Сообщениями могут быть также любые графические компоненты, унаследованные от класса Component, которые без изменений вводятся в стандартные диалоговые окна. Давайте опишем все поддерживаемые типы сообщений, чтобы их удобно было держать «под рукой» (табл. 14.2).

Таблица 14.2. Поддерживаемые JOptionPane типы сообщений

Тип сообщения

Способ обработки

Любой объект (то есть уна-

Вызывается метод объекта toString(), и полученный результат (стро-

следованный от класса

ка) выводится на экран с помощью «рабочей лошадки» библиоте-

Object, но не от Component)

ки — надписи JLabel (отсюда и поддержка HTML)

Графический объект

Добавляется в область сообщений методом контейнера add() и без

(то есть унаследованный от

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

Component)

используется расположение GridBagLayout, компоненты оно разме-

 

щает по рядам, один над другим. Несколько компонентов в одном

 

ряду вы может разместить сами, передав в качестве сообщения за-

 

полненную ими панель JPanel

Значок Icon

Еще один особый случай. Этот значок также выводится с помощью

 

надписи JLabel, причем располагается он по центру надписи. Если

 

выхотитедругогоповедения, создайтеинастройтенадписьсознач-

 

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

Массив объектов Object

Обрабатывается рекурсивно: для каждого элемента массива, при-

 

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

 

соответствующая процедура. Массив может содержать другой мас-

 

сив (ведь массив является самым обыкновенным объектом), для

 

него повторяется та же рекурсивная процедура

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

Ввод данных

Замечательно, что мы уже умеем всего несколькими строками выводить разнообразные данные (методом showMessageDialog()), обратимся теперь к возможностям класса JOptionPane по вводу данных. Для этого служат несколько перегруженных методов showInputDialog(), их довольно много, но все они очень похожи друг на друга. Сначала проиллюстрируем работу этих методов несложным примером, а затем разберем их немного подробнее:

//InputDialogs.java

//Стандартные диалоговые окна JOptionPane для ввода данных import javax.swing.*;

import java.awt.event.*; import java.awt.*;

public class InputDialogs extends JFrame { // значок для одного из сообщений

Стандартные диалоговые окна

413

private ImageIcon icon = new ImageIcon("question.gif"); // данные для выбора

private String[] values = {"Белый","Красный","Зеленый" }; public InputDialogs() {

super("InputDialogs"); setDefaultCloseOperation(EXIT_ON_CLOSE);

// после щелчков на кнопках выводятся сообщения

JButton input1 = new JButton("2 и 3 параметра"); input1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

// ввод строки в текстовом поле

String res = JOptionPane.showInputDialog( InputDialogs.this,

"<html><h2>Светит ли солнце?"); res = JOptionPane.showInputDialog(

InputDialogs.this,

"Ваш ответ был таким?", res);

}

});

JButton input2 = new JButton("4 параметра"); input2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) { // позволяет задавать тип и заголовок

String res = JOptionPane.showInputDialog( InputDialogs.this, new String[] {

"Пароль введен неверно!", "Повторите ввод:"}, "Пароль", JOptionPane.WARNING_MESSAGE);

}

});

JButton input3 = new JButton("7 параметров"); input3.addActionListener(new ActionListener() {

// выбор из нескольких альтернатив

public void actionPerformed(ActionEvent e) { Object res = JOptionPane.showInputDialog(

InputDialogs.this,"Выберите любимый цвет:", "Выбор цвета", JOptionPane.QUESTION_MESSAGE, icon, values, values[0]);

JOptionPane.showMessageDialog( InputDialogs.this, res);

}

});

414

ГЛАВА 14

// добавляем кнопки в окно setLayout(new FlowLayout()); add(input1);

add(input2);

add(input3); setSize(400, 200); setVisible(true);

}

public static void main(String[] args) { SwingUtilities.invokeLater(

new Runnable() {

public void run() { new InputDialogs(); } });

}

}

В окне JFrame, от которого в примере мы наследуем класс, размещаются три кнопки. Щелкая на них, вы сможете выводить на экран соответствующим образом настроенные стандартные диалоговые окна JOptionPane для ввода информации.

Первая кнопка создает самый простой и поэтому чаще всего используемый вариант диалогового окна для ввода несложной информации. В качестве параметров этому диалоговому окну нужно передать родительский компонент (любой графический компонент, по центру которого диалоговое окно будет размещаться на экране) и объектнадпись, сообщающий пользователю, что от него требуется. Поддерживаемые классом JOptionPane виды надписей мы только что обсудили (если вы уже успели забыть их, вернитесь к табл. 14.2). Для первого диалогового окна сообщением стала строка в формате HTML. Создаваемые первой кнопкой диалоговые окна используют для ввода данных простое текстовое поле, которое следует сразу за текстом сообщения. Запустив программу с примером, вы сможете увидеть, как выглядит подобное диалоговое окно. Кроме того, есть похожий, но чуть более удобный способ получения информации из текстового поля. Для него требуется дополнительный параметр — начальное значение, которое появляется в текстовом поле. Обратите внимание, как мы этим способом подтверждаем ввод, в качестве дополнительного параметра передавая только что полученную строку.

В том случае если пользователь подтвердил свой выбор щелчком на кнопке OK, первые два рассмотренные нами варианта метода showInputDialog() возвращают строку String, которую он набрал в текстовом поле. Если ничего набрано не было, возвращается