- •Листинг 1. Создание окна с текстовым полем ввода
- •If (btName.EqualsIgnoreCase(btYes.GetText())) {
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •Листинг 2. Наследование классов компонентов
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •1. Чтобы научиться программировать — нужно программировать!
На заметку:
В конструкторе для кнопки подтверждения ввода btYes установлен режим, при котором кнопка неактивна (выделена серым цветом и недоступна для нажатия). Делается это для того, чтобы предотвратить возможную ошибку ввода, когда пользователь щелкает кнопку подтверждения при некорректном (нечисловом) значении в поле ввода. Достигается такой чудесный эффект с помощью команды btYes.setEnabled(false) .
Все остальное достаточно просто. Банально создаются две кнопки, задается реакция окна на закрытие через щелчок на системной пиктограмме, банально добавляется в окно поле и метка, а также кнопки. Также отменяется режим отображения рамки фокуса вокруг текста в кнопке при передаче ей фокуса. Регистрация обработчиков в кнопках выполняется командами btYes. addActionListener(this) HbtNo.addActionListener(this).
На заметку:
В данном случае обработчики событий регистрируются в трех компонентах. Это две кнопки и текстовое поле ввода. В каждом из трех случаев в качестве обработчика событий указывается объект класса. Для кнопок обработчик регистрируется методом addActionListener() , поэтому обрабатывается событие ActionEvent и для обработки вызывается метод actionPerformed() (интерфейс ActionListener). Для поля обработчик регистрируется с помощью метода addKeyListener() из интерфейса KeyListeher. В этом интерфейсе объявлены методы keyReleased() (вызывается при отпускании клавиши на клавиатуре), keyPressed () (вызывается при нажимании клавиши на клавиатуре) и keyTypedO (вызывается как реакция на ввод символа с клавиатуры). Эти методы необходимо описать в классе IntlnputFrame, поскольку объект этого класса регистрируется как обработчик события в текстовом поле. Обрабатываемое событие относится к классу KeyEvent.
При отпускании клавиши на клавиатуре вызывается метод keyReleased(). Аргументом метода при описании указывается объект события класса KeyEvent.
На заметку:
Метод keyReleased() вызывается каждый раз, когда пользователь отпускает нажатую клавишу. Мы воспользуемся переопределением этого метода для проверки, является ли текущее содержимое текстового поля ввода числом или нет. Проверка выполняется так: пытаемся преобразовать содержимое поля в целое число. Если ошибки при этом не возникает, делаем кнопку подтверждения активной (доступной для нажатия). Если возникла ошибка, кнопка недоступна для нажатия. Все просто.
В теле метода в блоке try делается попытка преобразовать текст в поле ввода в число, для чего используем команду Integer .parselnt (tf. getText () ). В этой команде инструкцией tf. getText () считывается значение в текстовом поле ввода t f и результат передается аргументом статическому методу parselnt () класса Integer.
На заметку:
Напомним, метод parseInt() преобразует текстовое представление целого числа в целое число.
Если при этом не возникает ошибки, то выполняется следующая команда btYes.setEnabled(true), благодаря чему кнопка btYes становится активной (доступной для нажатия). Если при попытке преобразования текста в число включается обработка исключения в catch-блоке, в этом блоке выполняется команда btYes.setEnabled(false), и кнопка btYes становится неактивной (недоступной для нажатия).
Ш На заметку:
В catch-блоке аргументом указан объект класса Exception. Это суперкласс для классов обрабатываемых исключений. Поэтому перехватываться в блоке будут все исключения, какие только можно перехватить.
Два других метода keyPressed () и keyTyped () нам для работы не нужны, но их все равно нужно описать. Здесь мы используем "пустое" описание: после сигнатуры каждого из методов указана пустая пара фигурных скобок.
На заметку:
В данном случае становится очевидным преимущество использования классов-адаптеров по сравнению с использованием интерфейсов. Хотя нам нужен только один метод интерфейса KeyListener, описывать приходится все методы этого интерфейса. В классе-адаптере методы интерфейса имеют пустую реализацию. При наследовании класса-адаптера достаточно переопределить только явно используемые методы.
Обработка нажатия кнопок выполняется методом actionPerformed(). В методе сначала определяется, какая кнопка нажата. Если это кнопка завершения работы, работа программы завершается (команда System.exit(0)). Для обработки нажатия кнопки подтверждения последовательность действий такая. Командой age=Integer.parseInt(tf.getText()) в целочисленное поле age записывается результат преобразования в число текстового значения поля tf. Затем командой frame.setVisible(false) окно убирается с экрана. После этого двумя командами String msg="Добрый день, "+name + "!\n" и msg+="Baш возраст - "+age+" лет !" в текстовую переменную msg записывается текстовое сообщение, предназначенное для отображения в следующем окне. Это следующее окно отображается командой MessageFrame.show(msg). Здесь для отображения третьего окна использован статический метод show() класса MessageFrame. Методу в качестве аргумента передается текстовая переменная msg. Класс MessageFrame и его методы (в том числе и show()) описываются далее. У класса IntInputFrame также есть статический метод show(). Он принимает два аргумента, которые передаются аргументами конструктору класса IntInputFrame при создании анонимного экземпляра этого класса в теле метода.
Класс MessageFrame для реализации окна с сообщением реализует интерфейс ActionListener. Он содержит две метки (одна с изображением, другая с текстом) и одну кнопку. У класса есть такие закрытые поля: ссылка frame класса JFrame (объект окна сообщения), ссылки il и message класса JLabel (метки с изображением и метка с текстом), ссылка button класса JButton(объект кнопки).
У конструктора класса один текстовый аргумент. Записанный в нем текст предназначен для отображения в окне. В частности на основе аргумента конструктора формируется текстовое значение одной из меток. В частности, текстовая метка создается командой mess age=new JLabel("<html>"+msg.replace("\n","<br>")+"</html>",JLabel.LEFT). Здесь конструктору первым аргументом передается текстовая строка "<html>"+msg. replace("\n","<br>")+"</html>". Формируется она так. В текстовом параметре msg (аргумент конструктора) все инструкции перехода к новой строке "\n" заменяются на последовательность "<br>" (инструкция начала новой строки в html-формате). Полученный в результате текст вставляется между тегами <html> и </html>. Это позволяет использовать инструкцию "\n " для начала новой строки в тексте, передаваемом для отображения в окне. Мелочь, а приятно.
В конструкторе командой Imagelcon img=new Imagelcon ("d:/Books/Files/pict.gif") создается объект изображения. В команде il=new JLabel(img) этот объект использован для создания метки с графическим изображением в качестве значения. Это изображение появится в главной панели окна. Командами int w=img.getlconWidth () и int h=img.getlconHeight () выполняется считывание размеров изображения. Положение и размер метки с изображением определяется командой il.setBounds(10,10,w,h) с учетом считанных ранее размеров изображения.
Еще одно изображение, которое отображается в строке названия окна (в качестве пиктограммы), создается командой Image icon=frame.getToolk.it().getImage ("d:/Books/Files/logo.jpg"). Здесь для создания объекта пиктограммы вызывается метод getImage(). Метод вызывается через объект инструментария для окна. Доступ к последнему получаем путем вызова метода getToolkit() из объекта окна frame. Применение пиктограммы для окна выполняется командой f rame.setIconImage(icon).
Обработка щелчка на кнопке (метод actionPerformed()) состоит в завершении программы. Еще в классе MessageFrame есть статический метод show(). Этот метод мы уже упоминали выше при обсуждении кода предыдущего класса. Метод принимает текстовый аргумент. Аргумент передается конструктору KnaccaMessageFrame при создании анонимного объекта класса.
B классе UsingFramesDemo в методе main() командой TextInputFrame.show("Как Вас зовут? Введите имя:") отображается окно с полем для ввода имени пользователя. Все остальное зависит от пользователя.
Если ввести (или не вводить) в поле имя (или просто текст) и щелкнуть кнопку Подтверждаю, появится следующее окно с запросом о возрасте.
Особенность этого окна состоит в том, что если в текстовом поле указано нечисловое значение, то кнопка Подтверждаю неактивна. Но стоит только исправить значение в поле, статус кнопки меняется.
После щелчка на кнопке Подтверждаю появляется окно с сообщением, в котором указано имя и возраст пользователя.
После щелчка кнопки Прочитано окно закрывается, а работа программы завершается.
На заметку:
Обращаем внимание, что щелчок кнопки Завершить любого из первых двух окон или системной пиктограммы закрытия окна любого из трех окон приводит к завершению работы программы.
Наследование классов компонентов
Не секрет, что графический интерфейс можно создавать по-разному. Один из способов подразумевает создание собственных классов, как для отдельных компонентов, так и для окон. Такой способ реализации структуры классов проиллюстрируем на примере. Перед рассмотрением программного кода предварительно очертим основные моменты, связанные с функциональными возможностями создаваемого приложения.
При запуске программы отображается окно с двумя кнопками
У окна несколько функциональных элементов, а именно панель меню (состоит из трех меню Окно, По горизонтали и По вертикали) и две кнопки с названиями Да и Нет (обе кнопки с пиктограммами). В области окна отображается пиктограмма (с изображением зайца), статический текст Хотите переместить окно? (текст отображается большими буквами) и меньшими буквами отображается текст По горизонтали и, через пробел, на месте, а также в новой строке По вертикали и, через пробел, на месте. Текст в том месте, где при запуске программы отображается на месте, в процессе выполнения программы может меняться.
Меню Окно содержит два пункта: Подтверждаю и Выход .
При щелчке на кнопке Да или выборе пункта меню Окно ► Подтверждаю
происходит перемещение окна. Окно может перемещаться, независимо по горизонтали и вертикали, на 50 пикселей влево/вправо и вверх/вниз, а также может оставаться на месте. Направление перемещения выбирается с помощью пунктов меню По горизонтали и По вертикали. При выборе одного из пунктов в области окна меняется текстовое значение для обозначения соответствующего направления перемещения. Предварительно выбраны пункты По горизонтали ►Вправо и По вертикали ►Вниз, поэтому в области окна указаны именно эти направления.
После щелчка на кнопке Да (или выборе пункта меню Окно ► Подтверждаю)
окно переместится на 50 пикселей вправо и 50 пикселей вниз. Щелчок на кнопке Нет, выбор пункта меню Окно ►Выход или закрытие окна с помощью системной пиктограммы приводит к завершению работы программы. Теперь обратимся к коду. Он представлен в листинге 2.
