- •Листинг 1. Создание окна с текстовым полем ввода
- •If (btName.EqualsIgnoreCase(btYes.GetText())) {
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •Листинг 2. Наследование классов компонентов
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •1. Чтобы научиться программировать — нужно программировать!
На заметку:
Еще раз обращаем внимание, что классы MyButton, MyMenuBar и MylconLabel определены так, что создание объекта класса автоматически означает добавление соответствующего компонента в окно, переданное первым аргументом конструктору класса. Здесь первым аргументом указывается ключевое слово this, что означает добавление компонента в окно, соответствующее объекту вызова.
Но на этом мучения окна не заканчиваются. Так, командой JLabel msg=new JLabel ("Хотите переместить окно?") создается текстовая метка. Ее положение и размеры задаются командой msg. setBounds (getWidth()/4,15,3*getWidth()/4-10,getHeight()/4-5). Для метки применяется специальный шрифт. Шрифт - это объект класса Font.
На заметку:
Для использования класса Font мы командой import Java.awt.* подключили библиотеку AWT.
Объект шрифта создается командой Font fnt=new Font ("Arial", Font.BOLD, 18). В данном случае создается объект для шрифта типа Arial, жирного, размера 18. Применение шрифта для метки с текстом выполняется с помощью команды msg.setFont(fnt). Здесь метод setFont() вызывается из объекта метки msg, а аргументом метода указывается объект fnt шрифта. Добавление текстовой метки в окно выполняем с помощью команды add(msg).
Панель с текстовыми метками создается командой move=new MyPanel(). Это как раз та панель, текстовые значения меток которой меняются при работе с панелью меню. Положение и размеры панели определяются командой move.setBounds(msg.getX(),msg.getY()+msg.getHeight()+1,msg.getWidth(),msg.getHeight()). Добавление панели в окно выполняется с помощью команды add(move).
На заметку:
Обратите внимание, что в окне менеджер компоновки отключен. В это окно добавляется панель, для которой задан менеджер компоновки. Противоречия здесь нет. Компоненты в панели упорядочиваются менеджером компоновки этой панели. Панель является компонентом окна, поэтому при размещении панели в окне ее позиция определяется менеджером компоновки окна.
Кроме этого, для окна устанавливается режим, не позволяющий изменять размеры окна, для чего используем инструкцию setResizable(false). Отображается окно командой setVisible(true). Все эти чудесные действия выполняются в конструкторе класса MyFrame.
Кроме конструктора, в классе описан метод handler(), который вызывается для перемещения окна при обработке щелчка на кнопке Да или при обработке пункта меню Подтверждаю. Метод не возвращает результат, и в теле метода выполняется всего одна команда setLocation (getX() +step[0],getY()+step[1]). Здесь для определения текущей позиции по горизонтали и вертикали используются методы getX() и getY(). Значение шага перемещения по горизонтали и вертикали считывается из поля-массива step.
Класс обработчика для щелчка на кнопке Нет или выбора пункта меню Выход называется HandlerNo, реализует интерфейс ActionListener. В классе переопределяется метод actionPerformed (), в котором командой System.exit(0) завершается работа программы. Класс обработчика для щелчка на кнопке Да или выбора пункта меню Подтверждаю называется HandlerYes. Он тоже, по определению, что называется, реализует интерфейс ActionListener. У класса есть закрытое поле frame (ссылка на объект окна класса MyFrame), а также конструктор с одним аргументом. В конструкторе закрытому полю присваивается значение. В переопределяемом методе actionPerf ormed() для обработки щелчка на кнопке из объекта окна frame вызывается метод handler() для обработки события щелчка на кнопке или выбора пункта меню.
Более содержательным является класс MenuHandler обработчика для выбора пунктов меню По горизонтали и По вертикали. Класс реализует интерфейс ActionListener. У класса есть закрытое поле frame класса MyFrame, а также закрытое логическое поле dir, с помощью которого различаем меню По горизонтали и По вертикали (значение true соответствует меню По горизонтали, а значение false соответствует меню По вертикали). Все интересное происходит в методе actionPerf ormed(). Этот метод вызывается при выборе одного из пунктов меню. Сначала командой String cmd=ae.getActionCommand() выполняется считывание команды действия, то есть названия пункта меню, которое выбрано. Дальше с помощью системы вложенных условных операторов определяем последовательность выполняемых действий.
Так, для меню По горизонтали командой frame .move . HLab.setText(cmd.toLowerCase()) текстовое значение команды действия (переменная cmd) переводится в нижний регистр (метод toLowerCase () ). Результат передается аргументом методу setText (). Метод вызывается из объекта метки HLab и задает текстовое значение этой метки. Сама метка HLab является полем объекта панели move, которая, в свою очередь, является полем окна frame. Поэтому полная ссылка на панель выглядит как frame.move.HLab.
Кроме изменения текстового значения метки, необходимо также установить/ изменить значение соответствующего элемента поля step. Здесь уместно напомнить, что элемент step[0] отвечает за перемещение по горизонтали. Элемент может быть изменен методом setH(). Элемент step[1] отвечает за перемещение по вертикали. Его значение изменяется методом setv(). Какой метод и с каким аргументом вызывать, определяем во вложенных условных операторах, в которых имя выбранного пункта меню (переменная cmd) проверяется на предмет совпадения с возможными вариантами. При этом для сравнения текстовых значений используется метод equalsIgnoreCase(), то есть сравнение выполняется без учета состояния регистра.
Аналогичная процедура выполняется для случая, когда выбран пункт меню По горизонтали. В классе MakeComponentsDemo с главным методом программы инструкцией new MyFrame(" Служба перемещения окна \"Быстрый Заяц\" . . . " , 380, 180) создается анонимный объект класса MyFrame. В результате на экране появляется окно, которое мы увидим при выполнении программы.
Резюме
