Материал: Портянкин И. Swing

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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, которую он набрал в текстовом поле. Если ничего набрано не было, возвращается

Источник: https://studfile.net/preview/15935977/