Создание диалоговых окон

В

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

Большинство диалогов являются модальными. Модальный диалог (Modal Dialog) Появляется над породившим его окном и не позволяет пользователю вернуться в ро­дительское окно до тех пор, пока он или она не завершит работу с диалогом. Это очень удобный способ заставить пользователя завершить некоторые шаги в после­довательности, которую сочтет удобной программист.

Большая часть кода, приведенного в данной главе, присутствует в программе DialogDemo, Которую можно найти в сопровождающих книгу материалах, а также на сайте Www.Eivenware.Com. Вы можете запустить эту программу или создать ее само­стоятельно, следуя приведенным ниже инструкциям.

Запуск приложения DiaIogDemo

Для создания программы DialogDemo Сначала создайте простое приложение, содер­жащее строку меню и диалог "О программе", как объяснялось в главе 3. И строка меню, и диалог "О программе" создаются на второй странице мастера создания приложения.

Запустите программу и выберите пункт меню Help ∣ About. Появится диалог, по­казанный на рис. 19.1. Главное, на что нужно обратить внимание — что этот диалог модальный. Пока вы не закроете этот диалог, вы не сможете ничего сделать с глав­ным фреймом программы.

Использование диалога "О программе", созданного JBuiIder

Глядя на рис. 19.1, вы можете заметить, что этот диалог слегка скучноват. Один из наиболее быстрых способов увеличения его привлекательности состоит в добав­лении на него изображения, как показано на рис. 19.2.

Для преобразования диалога на рис. 19.1 в диалог, показанный на рис. 19.2, не­обходимо всего лишь подобрать подходящую картинку и изменить в приложении одно-единственное слово.

Итак, первое, что нужно сделать — найти картинку. Если у вас есть цифровой фо­тоаппарат или способности к рисованию, то вы сможете создать ее самостоятельно. Кроме того, на Web-сайте вашего предприятия может находиться много небольших изображений, пригодных для выгрузки.

рис. 19.2.
диалог "о программе", созданный jbuilder по умолчанию, с добавленным изображением
Рис. 19.1. Модальный диалог "О программе’ созданный JBuilder По умолчанию и расположенный поверх окна JFrame

about

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

Необходимо, чтобы выбранное вами изображение было файлом JPG-, GIF — или PNG-формата. В настоящее время предпочтительнее использовать первый и третий типы. Скопируйте файл в тот же каталог, где находится исходный файл диалога "О программе", который по умолчанию называется Framei-AboutBox. java.

Выберите в редакторе строку Frame1_AboutBox. java. Найдите в методе jbinɪt первую строку, которая должна выглядеть следующим образом:

//imageLabel. setlcon(new ImageIcon(

Framel-AboutBox. class. getResource("[Your Image]")));

Уберите символы комментария и впишите имя нужного графического файла, об­ращая внимание на регистр букв:

ImageLabel. setlcon(new ImageIcon(

Framel-AboutBox. class. getResource("ElvenwareLogo. png"))) ;

Теперь все готово: на диалоге появился логотип!

Можно сделать еще одно простое изменение: перенести панель, на которой на­ходятся тестовые элементы вашего диалога, под низ картинки. Для этого потребует­ся всего лишь изменить ее свойство constraints с Center на South. Теперь заполните остальные поля диалога. Заполненное диалоговое окно должно быть похоже на по­казанное га рис. 19.3.

Вы можете заметить, что на рис. 19.3 название программы выводится большими жирными буквами. Для создания такого эффекта выберите компонент JLabeI, со­держащий название вашего продукта. В инспекторе JBuilder выберите свойство font

рис. 19.3. завершенный диалог "опрограмме" для программы dialogdemo рис. 19.4. настройка шрифта, применяемого для отображения текста в диалоге "о программе"

(шрифт) и, щелкнув на кнопке эллипсиса, вызовите диалог Font (см. рис. 19.4). Из­мените размер шрифта на 14 и выберите атрибут Bold (полужирный).

Создание диалогов ввода с помощью JOptionPane

примечаниеВ данном разделе вы узнаете несколько способов быстрого создания диалогов с помощью JOptionPane. Создаваемые нами диалоги будут вызываться из меню про­граммы DialogDemo. Поэтому вам потребуется изменить меню, вставленное в про­грамму мастером создания приложения.

Если вы забыли добавить меню в мастере создания приложения, просто захватите элемент JMenuBar со страницы Swing Containers палитры компонентов и пе­ретащите его на панель структуры. Затем в конец метода jblnit добавьте следующую Строку: This.SetJMenuBar(JMenuBarl);.

Щелкните правой кнопкой мыши на узле меню в панели структуры и выберите в появившемся всплывающем меню пункт Activate Designer. Теперь измените меню, Чтобы оно стало похоже на изображенное на рис. 19.5.

C помощью конструктора меню вы можете вставлять пункты меню и разделите­ли, щелкая правой кнопкой мыши на конструкторе и выбирая нужные пункты из всплывающего меню. Если у вас возникнут трудности, обратитесь к главе 14.

Диалоги ввода и информационные диалоги

После создания меню выберите пункт меню Input Dialog и перейдите на страницу Events инспектора. Выберите событие action Performed и либо дважды щелкните на редакторе свойств, либо выберите редактор свойств и нажмите клавишу Enter. Вы окажетесь в редакторе исходного кода. Измените обработчик события, чтобы он выглядел в соответствие с одним из приведенных ниже трех вариантов:

Void jMenuIteml_actionPerformed(ActionEvent Е)

{

Stcinginput= (String)JOptionPane. ShowInputDialog(this, null, null, JOptionPane. QUESTION MESSAGE, null, new String[] {"Ваня", "Петя”), Null);

If (input! = null,

{

JOptionPane. ShowMessageDialog(this, nBu Ввели: ,, + input);

}

}

Void jMenuIteml_actionPerformed (ActionEvent e)

{

String input = (String)JOptionPane. ShowInputDialog(this, null, null, JOptionPane.Questionjmessage, Null, null, "Tux");

If (input!= null)

{

JOptionPane. ShowMessageDialog(this, "Вы Ввели: "+input);

>

)

∕∕ Этот самый простой вариант может работать только в JDK

// Версии 1.4.0 И Выше

Void jMenuIteml_actionPerformed(ActionEvent e)

{

String input = JOptionPane. ShowInputDialog(this, "Введите Имя", "Tux"); if (input!= null)

{

JOptionPane. ShowMessageDialog(this, "Вы Ввели: " +input);

)

)

Builder 7 — <j ∕Sre Jeva∕jbbook∕fundarnentals∕DialogDemo∕src∕dialogd

file edit search view project run team wizards tools window help d £ ⅛ ’ ⅜ bq'* ”
sd > ’ 'io* ∙, ’ r β ∙ *, **
,“л ⅛4 ⅞t tl u⅛
-.!■■i 4-'^'∙'∙ w"l _ thm
,diaioodemojpx φ «project source» i
dialogdemo ς⅛ dialoodemo.html & dialogdemo java i ⅛r frame1 java >& framei-aboutboxj
,x⅛ dialogdemo 5: & frame1 j x,⅛ frame1 -aboutbox ∣
p swing ∣ swing containers bvenware i dataexpress i cbswing i more dbsw⅜⅝ ,i,j
,( f⅛j «-,hh,dialogdemo.frame1. ⅛ i_j ul
2 qthis
θ f~ c ɔf ιtentf
1 u borde k⅛ ljmenu
й jbe jmenubarl b § imenufik
= й jmem ɪ
,⅛ s ⅞ χ ⅜⅛ %
file options help inputdiaiog confirm dialog message dialog
custom joptionpane custom dialog
,source design [bean j uml1 dotj htstoiy),jmenujl,action,actionc...,options,actionm..,allgnme..,alignme,armed,backgro,.,border,borderp,content...,0.5,0.5,false,o white,custom,false,true,properties ∣ events
рис. 19.5. вид меню для программы dialogdemo в режиме конструирования

примечаниеПервый из приведенных здесь вызовов — вызов статического метода класса JOptionFane, Который обращается к ShowinputDiaiog. Обратите внимание, что этот вызов не будет компилироваться, если вы не поместите в начало исходного файла оператор импорта Javax.Swing. JOptionPane ИЛИ Javax.Swing.*. Второй ИЗ Этих операторов импорта обычно по умолчанию включается самим JBuilder.

Статический метод объекта — это метод, который может быть вызван без предварительной инициализации объекта. Подобный код не нужен:

JOptionPane MyDialog = New JOptionPaneO; // Не нужен,

// если вы используете JOptionPane

MyDialog.ShowInputDialog(This, "Введите имя", "Tux");

B частности, нет необходимости создавать экземпляр JOptionPane. Программа вызы­вает ShowInputDialog прямо через имя самого класса. Это возможно потому, что ме­тод ShowInputDialog является статическим. Суть статических методов состоит в том, Что для их использования не нужно создавать экземпляр их класса.

Первые два из вышеприведенных вариантов работают только в JDK версии 1.3.1 и выше. Вот как выглядит вызов:

Public static Object ShowInputDialog(

Component parentComponent, ∕∕ Родительское окно,

// над которым появляется диалог

object message, string title,∕∕ Строка-подсказка пользователю о вводе // Заголовок диалогового окна int XnessageType,// Константа вроде WARNING MESSAGE // или QUESTIONeMESSAGE

Icon icon, ∕/ Пиктограмма наподобие показанной в проекте WorkingButtons //в сопровождающих материалах

Object[] SelectionValues, // Обычно массив строк для выбора пользователем Object InitiaiselectionValue) // Обычно строка, предлагаемая по умолчанию

В первом параметре передайте потомка JFrame Или другой компонент, над кото­рым появится диалог. Как вы увидите позже в данной главе, вторым параметром мо­жет быть JPanei Или другой потомок JComponent, Но обычно это строка, подсказы­вающая пользователю ввести значение. В третьем параметре передается заголовок диалога, а в четвертом — константа, задающая одну из предопределенных пиктог­рамм. Пятым параметром может быть своя созданная вами пиктограмма, наподобие показанной в проекте WorkingButtons Из предыдущей главы. Последние два пара­метра — обычно неизменяемый список строк для выбора пользователем и строка по умолчанию, которую пользователь может редактировать.

Третий вариант — это присутствующий в JDK версии 1.4.0 метод ShowinputDialog, Который может принимать много различных параметров. Однако наиболее полез­ными из них являются следующие:

Public static String ShowInputDialog(

Conponent parentComponent,

‘ Objectmessage,

Object InitiaiselectionValue)

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

Input

×

• > * 1⅛

Q ∖ Enter Name

И

S’ Tud

? OK L

I Cancel ∣

: & &

⅛∕⅞ ÷> ∖ ,..r^ > t Γ / ^, 1 ¾∖

рис. 19.6. простой диалог inputdialog с талисманом linux tux в качестве значения по умолчаниюДительское окно. Во многих случаях дос­таточно передать в этом параметре null, но если можете, все-таки передайте ссыл­ку на родителя. В нашем случае передача родительского окна обеспечивает, что ди­алог будет модальным по отношению к Framel. Следующий параметр является подсказкой пользователю. И последний параметр — это значение по умолчанию, которое пользователь может либо при­нять, либо редактировать. То, что получается в результате, показано на рис. 19.6.

Диалог ShowinputDiaiog из JDK версии 1.4.0 возвращает строку, введенную пользователем. Если пользователь щелкнул на кнопке Cancel (Отмена), этот диалог возвращает null. Поэтому при каждом пользовании диалогом ShowinputDialog вы должны проверять возвращаемое им значение на null.

примечаниеСчитая, что возвращенное значение не равно null, рассматриваемый нами код отображает его пользователю С ПОМОЩЬЮ Вызова JOptionPane. ShowMessageDialog. Как И ShowInputDialog, метод ShowMessageDialog может принимать множество различных параметров. Наиболее распространенными являются те, которые пока­заны здесь. Первый параметр содержит родительское окно, а второй — строку, кото­рую требуется отобразить.

Метод ShowMessageDialog не будет считать ошибкой попытку ото­бражения пустой строки (null). При этом появится нормальное диалоговое окно, в кото­ром отобразится знаменитое слово из четырех букв языка Java: null. (Автор, видимо, намекает на то, что многие самые популярные, причем неприличные слова английского Языка состоят именно из четырех букв — Прим, перев.).

Отображение диалога подтверждения с помощью JOptionPane

Вернитесь в режим конструирования Framel. Если необходимо, запустите кон­структор меню. Выберите пункт меню Confirm Dialog (диалог подтверждения), пе­рейдите на страницу Events инспектора и создайте следующий обработчик события1

Void jMenuItemConfirm_actionPerformed(ActionEvent е)

{

Int returnValue = JOptionPane. ShowConfirmDialog(this,

" Вы уверены?", "Подтвердите",

JOptionPane. OK_CANCEL_OPTION,

рис. 19.7. всплывающий диалог подтверждения с пиктограммой в виде восклицательного знакаJOptionPane. WARNING_MESSAGE);

1

В этом примере показано одно из наиболее МОЩНЫХ СВОЙСТВ ИЗ репертуара JOptionPane.

Результат вызова показан на рис. 19.7.

Вот объявление нашего конкретного ва­рианта сильно перегруженного метода ShowConfirmDialog:

384

Public static int ShowConfinnDialog(Component parentComponent,

Object message, String title, int optionType, int messageType)

Вы видите, что первый параметр метода является родительским окном, которое будет обладателем модального диалога подтверждения. Второй параметр обычно является строковым значением, содержащим отображаемое сообщение. Но он мо­жет быть и другого объектного типа. Подробнее на эту тему вы узнаете далее в этой главе, в разделе "Нестандартные диалоги на основе JOptionPane".

примечаниеПоследние два параметра этого варианта метода ShowConfirmDiaiog Являют­ся константами, определяющими детали диалога. Первая константа, ok_cancel_option, указывает VM отображать диалог, содержащий кнопки OK и Cancel (Отмена). Вторая задает присутствие в диалоговом окне пиктограммы с вос­клицательным знаком. Обычно диалог подтверждения содержит пиктограмму со знаком вопроса, но я задал нестандартный значок, дабы продемонстрировать, что эти детали поддаются настройке.

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

codelnsight въезжает на белом коне
я сказал, что существует несколько вариантов методов, используемых для отображения этих различных диалогов joptionpane. помните, что jbuilder всегда может вывести все эти варианты с помощью средства parameterinsight, показанного на рис. 19.8. вы можете вызвать parameterinsight, одновременно нажав клавиши ctrl+shift+пробел.
необычный информационный диалог
,component parentcomponent, object message,component parentcomponent, object message. object initiaiseiectionvaiue,componentparentcomponent, objectmessage1 stringtltle1 int messagetype,component parentcomponent, object message, string title, int messagetype, icon icon. objectq selectionvaiues, object initialselectionvalue
object message
,object message, object initiaiseiectionvaiue,рис. 19.8. c помощью parameterfnsight вы можете увидеть все варианты перегруженного метода

Теперь вам нужно создать обработчик события для пункта Message Dialog глав­ного меню Framel. Измените обработчик следующим образом:

Void jMenuItemMessage_actionPerformed(ActionEvent Е)

{

JOptionPane. ShowMessageDialog(this,

"Брахман — это жизнь, брахман — это счастье, брахман — это пустота", "Сатьякама Джабала",

JOptionPane. PLAIN_MESSAGE);

}

Эта версия метода ShowMessageDialog Использует константу JoptionPane-PLAiN-MESSAGE, чтобы не отображать пиктограмму (см. рис. 19.9).

brahman is itfe, brahman is joy, brahman is the void,рис. 19.9. информационный диалог без пиктограммы рис. 19.10. информационный диалог с нестандартной пиктограммой
satyakama jabata

Либо же вы можете задать свою пиктограмму, наподобие показанной на рис. 19.10, которая является картинкой из программы WorkingButton, Описанной в предыду­щей главе.

Вот код из программы WorkingButtons, Отображающий диалог, который показан на рис. 19.10:

// Поле данных

ImageIcon buttonlcon;

// Из Jblnit buttonlcon = new

ImageIcon(this. getClass().getResource("tux_config. png"));

// Обработчик события

Void jButton5_actionPerformed(ActionEvent e)

{

JOptionPane. ShowMessageDialog(this, "Выщелкнули на кнопке Linux", "Доктор пришел.", О, Buttonlcon) ;

1

Этот код достаточно подробно объяснялся в предыдущей главе. А сейчас вам надо лишь обратить внимание на объявление класса Imageicon, Код создания его экземпляра и способ задания пиктограммы в последнем параметре вызова ShowMessageDialog.

Нестандартные диалоги на основе JOptionPane

Последний JOptionPane, Который я хочу вам показать, использует этот стран­ный параметр метода ShowMessageDialog, Который может быть либо строкой, либо каким-то другим объектным типом. Фокус состоит в создании компонента, обычно потомка JPanel, Содержащего все элементы, которые вы хотите отобразить в своем диалоге. Затем вы передаете эту JPanel Вместо строки сообщения в вызов ShowMessageDialog ИЛИ ShowConfirmDialog. В Результате ВЫ увидите диалог C ва­шей JPanel Внутри

Сначала добавьте в программу DiaiogDemo Новый потомок класса JPanel. Для этого выберите в JBuilder пункт меню File ∣ New Class. Заполните поля диалога New Class (Новый класс), как показано на рис. 19.11, и щелкните на кнопке OK.

Установите компоновку панели CustoinPanei в BorderLayout. Поместите на нее компонент JTextArea со страницы Swing. Установите его свойство constraints в Center.

Class Wizard

Create a new Java class

Fill In the fields below to set the package, name, base class, and other options for the Java class which will be created.

рис. 19.11. создание custompanel, потомка jpanel-CIasslnformation i Package: Jdiaiogdemo j Classname. ∣Custon. Pane ∣

Base class: ∣javax swing. JPanel

Options

p generatedefaultconstructor p override abstract methodsP Public

1 Γ* Oeneratemalnmethod P Generate header comments

I Ок I

Cancel

Help

Введите в свойстве text компонента JTextArea следующую строфу из стихотворе­ния Томаса Траэрна (все стихотворение можно найти в сопровождающих книгу ма­териалах):

Чудо

Томас Траэрн

Я словно ангел в высоте!

Как ярко все вокруг!

Когда я появился вдруг

Во славы полноте*

Мир — словно вечность Бога, в ней

Душа моя живет;

И каждый миг из этих дней

Со мной и мне поет.

{Перевод Александра Моргунова)

Чтобы набрать это стихотворение, лучше сначала ввести его в каком-нибудь тек­стовом редакторе и затем скопировать введенный текст в свойство text компонента JTextArea. Я еще поговорю об этом более подробно в данной главе.

Теперь создайте обработчик события для пункта Custom меню JOptionPane:

Void jMenuItemCustomOption_actionPerformed(ActionEvent е)

{

CustomPanel CustomPanel = new CustomPanel();

JOptionPane. ShowMessageDialog(this,

CustomPanel,

"Томас Траэрн”,

JoptionPane-PLAINJMESSAGE) ;

Этот код сначала создает экземпляр только что со­зданной нами CustomPanel и затем передает этот эк­земпляр потомку JPanel во втором параметре вызова метода JOptionPane. ShowMessageDialog.

В программе также используется константа JOptionPane. PLAiNjdESSAGE, обеспечивающая от­сутствие пиктограмм в диалоге. Если запустить эту программу и выбрать соответствующий пункт меню, получится результат, изображенный на рис. 19.12.

Создание нестандартного диалога

Когда я сначала создавал диалог, показанный на рис. 19.12, я включил все восемь строф стихотворения поэта Томаса Траэрна, жившего в XVII веке. Я думал, что весь этот текст будет обработан без проблем, и разместил на JTextArea компонент JScrollPane, чтобы вставить полосы прокрутки. Но при попытке запуска оказалось, что все это не работает так, как я рассчитывал. В частности, полосы прокрутки не были видны, а диалог выходил за пределы экрана, и где-то там пряталась кнопка OK. Когда такое происходит, необходимо создавать специализированный диалог.

tbomai traberne xsonlec
thobtta tcahecne
how like an angel саже i down!
нес bright все all things here!
vhen clest амопд his wocks i dll appeae c how thelc glocy ме did ccovn'
the voeld eeseabled his eternity.
in which му soul did walk;
and ev,ry thing that 1 did see did with же talk.
the skies in theɪe magnificence,
the lively, lovely ale;
dh how divine, how soft, how sweet, how fait! the stats did entertain му sense.
and all the wocks of god, so height and puce, so rich and gceat did seen,
as if they ever bust endure .ɪn му esteea.
a native health and innocence
vlchin му bones did grow.
and while му god did all his gio ties show,
i felt a vigour in му sense
that was all spirit. i within did flow
vith seas of life, like vine;
i nothing in the world did know sut 'twas divine.
рис. 19.12. первые три строфы стихотворения томаса траэрна на языке оригинала, показанные в экземпляре диалога joptionpaneпримечаниеЯ хочу подчеркнуть, что во многих случаях JOptionPane отлично ра­ботает в качестве площадки для размещения потомков JPanel. Объекты, которые мож­но передавать через второй параметр вызова ShowMessageDialog, на самом деле мо­гут оказаться достаточно сложными. Они могут содержать много полей JTextField, кнопок и других элементов управления. Короче, инструмент обычно работает вполне нормально с множеством различных вариантов его вызова. Но иногда он отказывается работать. В этих случаях можно применить способ, о котором я сейчас расскажу. Чаще всего переход с нестандартной JOptionPane на нестандартный JDialog совсем не от­нимает времени В конце концов, потомок класса JPanel или JComponent, вставленный в JOptionPane, является многократно используемым визуальным компонентом, который может быть так же легко вставлен в JDialog. За дополнительной информацией о со­Здании многократно используемых компонентов обращайтесь в главу 17.

Чтобы создать этот диалог, выберите в JBuilder пункт меню File ∣ New и выбери­те на странице General пункт Dialog Wizard (Мастер создания диалога). Заполните поля мастера в соответствие с рис. 19.13.

примечаниеЕсли у вас нет никаких веских причин поступать иначе, для создания диа­лога лучше воспользоваться мастером создания диалога, а не мастером создания клас­са. Мастер создания диалога создает потомка класса JDialog, который содержит по­лезный код инициализации, в то время как мастер создания класса просто выдает голого потомка JDialog такого вида:

Public class ClassDialog extends JDialog {

Public ClassDialogO

{

1

рис. 19.13. создание нестандартного потомка jdialog с помощью мастера создания диалога

Сравните это с кодом, порожденным мастером создания диалога:

Import java. awt.*; Import javax. swing.*; public class Dialog2 extends JDialog {

JPanel panell = new JPanel () ;

BorderLayout borderLayoutl = new BorderLayoutO ; public Dialog2(Frame frame, String title, boolean modal)

{

Super(frame, title, modal); try {

Jblnit() ; pack () ;

)

Catch(Exception ex)

{

Ex. printStackTrace();

}

}

Public Dialog2 ()

{

This (null, ‘,", false);

}

Void jbɪnit() throws Exception {

Panell. setLayout(borderLayoutl); getContentPane().add(panell);

}

}

Щелкните на кнопке OK в мастере создания диалога. Перейдите в режим конст­руирования. Поместите в окно диалога компоненты JScroIIPane со страницы Swing

Containers палитры компонентов и JTextArea со страницы Swing. Установите свой­ство constraints компонента JScroIIPane в Center. Панель прокрутки JScroIIPane доба­вит полосы прокрутки внизу и справа области JTextArea.

Выберите JTextArea и перейдите в инспектор JBuilder. Найдите свойство text и вы­берите связанный с ним редактор свойства. Выберите большой кусок текста из ка­кого-то другого источника и вставьте его в редактор свойства. Не обращайте внима­ния, что окно редактора свойства мало, а ваш текст большой. Просто подготовьте где-нибудь текст, а затем вставьте его. Об остальном позаботится JBuilder.

Поместите в панель структуры только что созданного диалога компонент JPaneI. Установите его свойство constraints в South (Юг), чтобы оно находилось ниже JTextArea. Поместите на объект JPaneI кнопку. Назовите ее jButtonOK и измените текст на ней на OK. Конечный результат должен быть похож на то, что показано на рис. 19.14.

Создайте обработчик события для JButton, который должен выглядеть следую­щим образом:

Void jButtonOk_actionPerformed(ActionEvent Е)

{

This. dispose();

1

Этот вызов закроет диалог, когда вы вволю насмотритесь на него.

Теперь вернитесь к Framel И создайте обработчик события для последнего сфор­мированного пункта меню. Добавьте в него две строки кода, чтобы обработчик выг­лядел следующим образом:

Void jMenuItemCustomDialog_actionPerformed(ActionEvent Е)

(

TraherneDialog dig = new TraherneDialogO ; Dig. show();

t jbuilde ■ grzsrcjava-jbbookzftmdamentaisflsieloedeitiozsrcztliaiogd. -s с. *}

File Edit Search View Prolect Run Team Wizards Tools Window Help

D tf ⅛"-⅛ ⅛ ⅛ <j’k⅛"7a ⅛ β T MpVV V

S3 ► — ⅛ — ` ffl-*∙ ** ♦

Name

Jthie…………… i

Background

Q Conlrpl :

ContentPane

I I

DefaultClose..

HH. t yN-CL.

Enabled

.i. Tf⅛e………… ;

Ibnt

"Dialofl-, 0J2

Foreground

M Black j

QIassPane

JMenuBar

ɪ ;

IayeredPane

i] lɪl; «an ilayout modal __ resizable βtte!«defaultlayout»
jalsa _
itrue
» properties [events!K-⅛ CustomPaneI × ι⅛ D. alogDemo j X⅛Frame1 X & Framei-AboutBox X & TraherneDIaIog 1 Swing I Swing Canlalners I Bvwiware I DataExprsse, dbSwmg S Man CtoSwmg 1 ItoSwmg Mc Ms I InIemetBe Jɪ`J

рис. 19.14. создание нестандартного диалога, содержащего полосы прокрутки и компоненты jtextarea, jpanel и jbuttonFlev ft on the Splendout of Blne eyes,

And so did hedges, ditches, Halts, bounds,

I drean, d not ought of those.

But wander’d over all nen’β grounds.

And found repose.

Proptietles thenselves were nine.

And hedges ornanents;

Vails, boxes, cofferst7 and their rich contents Did not divide ny joys, hut all conbιne= Clothes, ribbons. Jewels, laces, I esteen*d Ry Joys by others worn:

For ne they all to wear then seen, d Uhen I was born.

Source^ De¾⅛nj Веап{Т|МиУрос[н1с1ог

390

Теперь запустите программу и выберите пункт меню "Custom Dialog" ("Нестанд. диалог"). Хотя результаты и впечатляют, но они не вполне верны. Этот диалог, как мы и хотели, содержит полосы прокрутки и не выходит за пределы экрана. Но он довольно узок и высотой во весь экран (см. рис. 19.15). Это лучше, чем было рань­ше, но еще далеко от совершенства.

Один из способов быстро поправить ситуацию — вернуться в режим редактиро­вания исходного кода потомка JDialog. Найдите конструктор и добавьте одну стро­ку, устанавливающую размеры диалогового окна:

Public TraherneDialogCFrame frame, String title, boolean modal)

{

Super(frame, title, modal); try {

Jblnit () ; pack () ;

∕∕ Эта строка добавлена для установки размеров диалога this. setSize(640, 480);

}

Catch(Exception ex)

{

Ex. printStackTrace();

)

}

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

Тем не менее, внешний вид диалога все еще не совсем удовлетворителен. Еще не­обходим код, центрующий диалог на экране. Это бывает нужно настолько часто, что

s=рис. 19.15.
диалог
trahernedialog уже можно использовать, однако у него неудобные размеры и форма
l- ∙ st∙ta of ilπmwcaaιce
ts* bliss, not trades and poverties,
■id fill ay sense.
ɪrw streets were pav'd vχt∆ golden stones, ire boys and girls were bine, ι,t how did all their lovely faces shine sons of aen веге holy ones,
«*-. 30y and beauty they appear'd to же,
■ rd every thing ∣alch het- 1 found, ɪe like an angel ɪ did see,
!dom'd the ground.
hch diaaond and pearl ead gold ry place was seen;
kare splendours, yellow, blue, red, white and gre< -«■ eyes did everywhere behold, eat wonders cloth'd with glory did appear, l..eaeat was ay bliss,
ιτ∙*t and ay wealth was ev'ry where:
» loγ to this*
d and devis'd proprieties,
hth envy, avarice
ik» fraud, those fiends that spoil even paradise, flew frow the splendour of nine eyes, ι 4 so did hedges, ditches. halts, bounds, eea,d not aught of those, wander'd over all wen's grounds,
•»-* found repose.
:eprletles thoseives were bine,
4 hedges ornaments;
eaɪɪs, boxes, coffers, and their rich contents divide ay joys, but all coabine.
riothes, ribbons, jewels, laces, i esteea’d »» joys by others worn:
Γor ae they all to wear then seea*d i was bom.
⅜cted «j ⅞, ⅞∣ ⅞ -b - ∣⅛j > ∙ ⅛f - *φ - ё ffl ∙
framefjfbouieta x=atrahamedatoflj
‘ i down'ʌrfiow bright 1'jlib∖ιevs.jar;g:\coapllets\jzsdkl.4. o∖jre∖lib∖jce.jar;g:\coapllers\jzsdkl.4.o∖jre∖llb∖jose~
4≈,,,≈κ =,,±Γ

Я создал метод, выполняющий за нас эту задачу. Перед тем как применить этот ме­тод, необходимо закомментировать код, задающий размер диалога в его конструк­торе. Теперь вернитесь к Framel, добавьте в него новый метод под названием ShowDialogSize и измените код запуска диалога:

Public void ShowDialogSize(Component parent, JDialog dig, int width, int height)

{

Dimension dlgSize = new Dimension(width, height);

Dimension OwnerSize = parent. getSize();

Point Ioc = parent. getLocation(); dig. setSize(dlgSize);

Dig. SetLocation((ownerSize. width — dlgSize. width) ∕ 2 + loc. x, (ownerSize. height — dlgSize. height) ∕ 2 + loc. y) ;

Dig. show();

)

Void jMenuItemCustomDialog_actionPerformed (ActionEvent e)

{

TraherneDialog dig = new TraherneDialogO ;

ShowDialogSize(this, dig, 640, 480);

}

примечаниеМетод ShowDiaiogSize принимает в качестве параметров родительское окно ди­алога, сам диалог и его желаемые размеры Этот метод отображает диалог в центре экрана, как показано на рис. 19.17.

В пакете com. elvenware. codebox имеется файл GuiBox. java. Он содержит подпрограмму ShowDialogSize и несколько аналогичных методов, которые отображают диалоговые окна самыми различными способами. Я включил этот код, что­Бы вы могли пользоваться всеми этими методами в собственных программах

Eyes did everywhere behold.

^. WODders cloth*d with glory did appear,

!>ent was ay bliss,

‘Mt and ay wealth was ev*ry where:

Ry to this!

ɛura’d and devis’d proprieties,

Ith envy, avarice

Nd fraud, those fiends that spoil even Farad ‘lev Croa the splendour of Blne eyes,

ιo did hedges, ditches. Halts, bounds,

S dreaa, d not aught of chose,

>jt wander’d over all sen’s grounds,

рис. 19.16. так
выглядит диалог после вставки кода, задающего его размеры и форму
Found repose.

Proprieties Cheaselves ι
hedges omaænts;

Kalis, boxes, coffers, and their rich contents id not divide ay joys, but all coablne. Iothes, ribbons, jewels, laces, Z csteea’d hr joys by others worn:

»or MB they all to near then seea’d I was born.

Void jbɪnit() Item

Pencil. setlayout (border IayoutlJ; lw, v,v ITextAresl. setText (bonder ⅝nNlhθMS 1

TtahemaDlalogJeva

рис. 19.17. диалог с заданными размерами и положением, отображаемый в середине экрана ιy∙s did everywhere behold, wonders cloth*d with glory did sgtpenrl •sent ∙u жу bliss,
end жу wealth was ev'ry «here: this!
,e.tχs,d and d∙vlβ*d proprieties,
• th envy, avarice
l*∣d fraud, those fiends that spoil even yaradissl r∣<w fεoa the splendour of ɪue eyes,
so did hedges,, ditches, lialts, bθunds0 dxeafe*d not ought of those, it wandervd over all aen°s grounds, id foιmd repose.

Теперь вроде бы все в порядке, но осталась еше одна неприятная проблема. Если вы внимательно посмотрите на рисунки 19 15—19 17, то наверняка заметите, что там отображается конец стихотворения Томаса Траэрна, а не начало. Я не знаю, почему JDK работает именно так, однако знаю, как это устранить.

Если вставить в диалог TraherneDialog Следующий код, то в момент отображе­ния диалога на экране содержимое JTextArea Сдвигается до упора вверх:

Public void show() 1

Super. show();

∕∕ Сдвиг вверх до начала текстовой области JTextAreal. SetCaretPosition(O);

1

Как вы знаете, метод show является одним из унаследованных от потомка JDiaiog. В Java все методы автоматически объявляются как виртуальные. Здесь ме­тод show замещен и чуть-чуть изменен. Вначале обратите внимание на вызов метода show предка:

Super. show() ;

Без этого вызова диалог не был бы правильно отрисован. Затем посмотрите на простой вызов метода JTe×tAreal. SetCaretPosition. Этот вызов сдвигает JTextArea Вверх до упора. Окончательный результат показан на рис. 19.18.

Я не стал тратить много времени на обсуждение шаблонного кода, генерируемо­го мастером создания диалога JBuilder. Большая его часть не очень интересна, но я все же приведу его в листинге 19.1, дабы вы увидели, как объявлять такой диалог.

рис. 19.18. диалог trahemedialog с тестом, сдвинутым в начало

Листинг 19.1. Код диалога TraherneDiaIog

Package dialogdemo ,*

Import java. awt.*;

Import javax. swing.*;

Import java. awt. event.*;

F **

* <p>Title: <∕p>

* <p>Description: <∕p>

* <p>Copyright: Copyright (c) 2002<∕p>

* <p>Company: <∕p>

* @author unascribed

* Gversion 1.O */

Public class TraherneDialog extends JDialog

{

JPanel panel1 = new JPanel ();

BorderLayout borderLayoutl = new BorderLayoutO;

JScrollPane jScrollPanel = new JScrollPane();

JTextArea jTextAreal = new JTextArea();

JPanel jPanell = new JPanel ();

JButton jButtonOk = new JButton();

FlowLayout fIowLayoutl = new FlowLayoutO;

Public TraherneDialog(Frame frame, String title, boolean modal) {

Super(frame, title, modal); try {

Jbɪnit(); pack () ;

//this. setSize(640, 480);

)

Catch(Exception ex)

ax.printstacktrace();

(

)

)

Public TraherneDialog()

<

This(null, " " , false);

}

Void jbɪnit() throws Exception

{

ρanell. setLayoutCborderLayoutl); jTextAreal. setText(

"WonderNNThomas TraherneNNHow like an angel came I down!NHow bright " +

"are all things here!NWhen first among his works I did appearNθ how,, + "their glory me did crown!NThe world resembled his eternity,Nln

Which " +

"my soul did walk,*NAnd ev‘ry thing that I did seeRiDid with me talk.N" +

,,NThe skies in their magnificence,NThe lively, lovely air,*Nθh how " + "divine, how soft, how sweet, how fair!NThe stars did entertain my " + "sense,NAnd all the works of God, so bright and pure,NSo rich and " + "great did seem,NAs if they ever must endureNln my esteem. NNA

Native " +

"health and innocenceNWithin my bones did grow,NAnd while my God did " + "all his glories show,Nl felt a vigour in my senseNThat was all

Spirit. " +

"I within did flowNWith seas of life, like wine,*Nl nothing in the " + "world did knowNBut,Twas divine.NNHarsh ragged objects were

Conceal*d,N" +

"Oppressions tears and cries,NSins, griefs, complaints, dissensions, " + "weeping eyesNWere hid, and only things reveal’dNWhich heav,Nly

Spirits, " +

"and the angels prize.NThe state of innocenceNAnd bliss, not trades " + "and poverties,NDid fill my sense.NNThe streets were pav,D with

Golden " +

"stones,NThe boys and girls were mine,Nθh how did all their lovely " + "faces shine!NThe sons of men were holy ones,Nln joy and beauty they " + "appear‘d to me,NAnd every thing which here I found,NWhile like an n + "angel I did see, NAdorn,D the ground. NNRich diamond and pearl and " + "goldNln ev,Ry place was seen,*NRare splendours, yellow, blue, red, " + "white and green,NMine eyes did everywhere behold.NGreat wonders

Cloth,D " +

"with glory did appear, XnAmazement was my bliss,NThat and my wealth " + "was ev,Ry where:\nNo joy to this *NNCurs,D and devis,D

Proprieties,N" +

"With envy, avariceNAnd fraud, those fiends that spoil even Paradise,N" +

"Flew from the splendour of mine eyes,NAnd so did hedges, ditches, " + "limits, bounds,Nl dream,D not aught of those,NBut wander*d over

All " +

"men‘s grounds,NAnd found repose.NNProprieties themselves were mine,N" +

"And hedges ornaments;NWalls, boxes, coffers, and their rich contentsN" +

"Did not divide my joys, but all combine.NClothes, ribbons, jewels, " + "laces, I esteem,DNMy joys by others worn:\nFor me they all to wear " + "them seem,DNWhen I was born, N") ;

JButtonOk. SetText("Ok"); jButtonOk. BddActionListener(

New TraherneDialog_jButtonOk_actionAdapter(this)); jPanell. setLayout(fIowLayoutl); getContentPane().add(panell);

Panell. add(jScrollPanβl, BorderLayoutaCENTER);

Panel1.add(j Panell, BorderLayout. SOUTH);

JPanell. add(jButtonOkz null);

JScrollPanel. getViewport().add(ɔTextAreal, null);

}

Void jButtonOk_actionPerformed(ActionEvent e)

{

This. dispose();

}

Public void show()

{

Super. show();

∕∕ Scroll to the top of the text area jTextAreal. SetCaretPosition(O);

}

}

Class TraherneDialog_jButtonOk_actionAdapter implements

Java. awt. event. ActionListener

{

TraherneDialog adaptee;

TraherneDialog_jButtonOk_actionAdapter(TraherneDialog adaptee)

{

This. adaptee — adaptee;

}

Public void actionPerformed(ActionEvent e)

Adaptee. jButtonOk_actionPerformed(e);

}

J

Рассматривая этот код, вы можете обратить особое внимание на то, как отформа­тировано стихотворение Траэрна. Когда я вставил этот код в редакторе свойства text компонента JTextArea, он был отформатирован, как показано на рис. 19.18. JBuilder самостоятельно выполнил работу по преобразованию стандартного текста в то, что может быть сохранено в Java-файле. Это экономит нам кучу времени, и именно по­этому я так настойчиво обращал ваше внимание на то, как вставлять стихотворение в исходный файл.

Резюме

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

И еще раз я предлагаю вам закрыть книгу, запустить JBuilder и посмотреть, смо­жете ли вы воссоздать по памяти программы, описанные в данной главе. Если полу­чится, попытайтесь обойтись только снимками экранов в качестве подсказке. Про­верьте, сможете ли вы воссоздать программы, не заглядывая в текст книги. Если сможете это сделать, значит, вы усвоили информацию, представленную в этой главе. Если вам нужна помощь, вы можете найти оба примера программ в сопровождаю­щих кни^у материалах, а также на сайте Www. eivenware. com. Программа, которая применялась в этой главе, называется DialogDemo.

Часть IV

Архитектура проекта

В этой части

20 Сочинение на Java

21 Комментарии и Javadoc-документация

22 Модульность

Чарли Калверт

Глава20

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *