- •Листинг 1. Создание окна с текстовым полем ввода
- •If (btName.EqualsIgnoreCase(btYes.GetText())) {
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •Листинг 2. Наследование классов компонентов
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •На заметку:
- •1. Чтобы научиться программировать — нужно программировать!
Листинг 2. Наследование классов компонентов
// Подключение пакетов:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
// Класс для кнопки:
class MyButton extends JButton{
// Ссылка на окно, в которое добавляется кнопка:
private MyFrame frame;
// Конструктор класса.
// Аргументы - окно, в которое добавляется кнопка и
// логическое значение, определяющее тип кнопки:
MyButton(MyFrame frame,boolean state){
// Вызов конструктора суперкласса:
super();
// Ссылка на окно для добавления в него кнопки:
this.frame=frame;
// Текст для записи имени файла изображения:
String fileName;
// Текст для записи имени кнопки:
String bName;
// Определение имени файла и названия кнопки:
if (state) {fileName="Yes.png" ;
bName="fla";
addActionListener(new HandlerYes(frame));}
else{fileName="No.png" ;
bName="Нет";
addActionListener(new HandlerNo());}
// Формирование полного имени файла с изображением:
fileName="d: \\books\\files\\"+fileName;
// Создание объекта изображения (пиктограммы):
ImageIcon icn=new ImageIcon(fileName);
// Применение пиктограммы для кнопки:
setIcon(icn);
// Применение названия для кнопки:
setText(bName);
// Отмена режима отображения рамки
// вокруг текста кнопки при передаче ей фокуса:
setFocusPainted(false);
// Размеры кнопки:
int w=frame.getWidth()/4;
int h=frame.getHeight()/8;
// Применение размеров для кнопки:
setSize(w,h);
// Координаты кнопки:
int x=frame.getWidth()/4,y=frame.getHeight()-h-50;
if (!state) x+=w+50;
// Положение кнопки в окне:
setLocation(х,у);
// Добавление кнопки в окно:
frame.add(this);}
}
// Класс метки с изображением:
class MylconLabel extends JLabel{
// Ссылка на окно, в которое добавляется метка:
private MyFrame frame;
// Конструктор класса.
// Аргумент - окно, в которое добавляется метка:
MylconLabel(MyFrame frame){
// Вызов конструктора суперкласса:
super () ;
// Заполнение поля класса:
this.frame=frame;
// Создание изображения:
ImageIcon icn=new Imagelcon("d:\\books\\files\\rabbit.gif”):
// Добавление изображения в метку:
setIcon(icn);
// Положение и размер метки:
setBounds(5,15,frame.getWidth()/4-10,frame.getHeight()-30);
// Добавление метки в окно:
frame.add(this);
}
//Класс для панели меню:
MyMenuBar extends JMenuBar{
// Ссылка на окно, в которое добавляется панель: .
private MyFrame frame;
// Конструктор класса.
//Аргумент - ссылка на окно, в которое добавляется панель
MyMenuBar(MyFrame frame) {
// Вызов конструктора суперкласса:
super() ;
// Присваивание значения ссылке на объект окна:
this.frame=frame;
// Первое меню "Окно":
JMenu wind=new JMenu("Окно");
// Пункты для меню "Окно":
JMenuItem apply=new JMenuItem("Подтверждаю");
JMenuItem exit=new JMenuItem("Выход");
// Регистрация обработчиков событий:
apply.addActionListener(new HandlerYes(frame));
exit.addActionListener(new HandlerNo());
// Добавление пунктов в меню "Окно":
wind.add(apply);
wind.add(exit);
// Добавление меню "Окно" в панель меню:
add(wind);
// Второе меню - "По горизонтали":
JMenu horiz=new JMenu("По горизонтали");
// Пункты для меню "По горизонтали":
JMenuItem left=new JMenuItem("Влево");
JMenuItem right=new JMenuItem("Вправо");
JMenuItem hnone=new JMenuItem("На месте");
// Регистрация обработчиков событий:
left.addActionListener(new MenuHandler(frame,true));
right.addActionListener(new MenuHandler(frame,true));
hnone.addActionListener(new MenuHandler(frame,true));
// Добавление пунктов в меню "По горизонтали":
horiz.add(left);
horiz.add(right);
horiz.add(hnone);
// Добавление меню "По горизонтали" в панель меню:
add(horiz);
// Третье меню - "По вертикали":
JMenu vert=new JMenu("По вертикали");
// Пункты для меню "По вертикали":
JMenuItem up=new JMenuItem("BBepx");
JMenuItem down=new JMenuItem("Вниз");
JMenuItem vnone=new JMenuItem("На месте");
// Регистрация обработчиков событий:
up.addActionListener(new MenuHandler(frame,false));
down.addActionListener(new MenuHandler(frame,false)) ;
vnone.addActionListener(new MenuHandler(frame,false));
// Добавление пунктов в меню "По вертикали":
vert.add(up) ;
vert.add(down);
vert.add(vnone) ;
// Добавление меню "По вертикали" в панель меню:
add(vert);
// Положение и размер панели меню:
setBounds(1,1,frame.getWidth()-1,frame.getHeight()/10) ;
// Добавление панели меню в окно:
frame.add(this) ;
} }
// Специальная панель:
class MyPanel extends JPanelf
// Ссылки на метки с текстом,
// указывающим направление перемещения:
public JLabel HLab; // по горизонтали
public JLabel VLab; // по вертикали
// Конструктор класса:
MyPanel(){
// Вызов конструктора суперкласса:
super ();
// Создание текстовых меток:
JLabel Ll=new JLabel("По горизонтали: ");
JLabel L2=new JLabel("По вертикали: ");
HLab=new JLabel("на месте");
VLab=new JLabel("на месте");
// Подключается менеджер компоновки.
// Панель разбивается на четыре ячейки (две строки и два столбца).
// Элементы в панели размещаются последовательно в эти ячейки
// Зазор между ячейками составляет 3 пикселя.
setLayout(new GridLayout(2,2,3,3));
// Добавление меток в панель:
add(Ll);
add(HLab);
add(L2);
add(VLab); }
//класс для реализации окна
class MyFrame extends JFrame {
//ссылка на панель с текстовыми метками:
public MyPanel move;
//числовое поле – массив, содержащий значения
//для шага перемещения окна по горизонтали и вертикали
private int[] step;
//метод для изменения шага перемещения по горизонтали
public void setH(int i) {
step[0]=i; }
//метод для изменения шага перемещения по вертикали
public void setV(int i) {
step[1]=i; }
//конструктор класса
//аргументы – название окна и его размеры
MyFrame(String text, int width, int height)n{
//вызов конструктора суперкласса
super();
//начальное значение для шага перемещений
step=new int[] {0,0};
//применение заголовка
setTitle(text0;
//положение и размеры окна
setBounds(400,300,witdh,height);
//отключение менеджера компоновки
setLayout(null);
//реакция на закрытие окна через системную пиктограмму
setDefaultCloseOperation(EXIT_ON_CLOSE);
//создание кнопок
new MyButton(this,true);
new MyButton(this,false);
//создание панели меню
new MyMenuBar(this);
//создание метки с изображением
new MyIconLabel(this);
//создание метки с текстом
JLabel msg=new JLabel(“Хотите переместить окно?”);
//положение и размеры метки с текстом
msg.setBounds(getWidth()/4,15,3*getWidth()/4-10,getHeight()/4-5);
//создание шрифта
Font fnt=new Font(“Arial”,Font.BOLD,18);
//применение шрифта для метки с текстом
msg.setFont(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) ; }
// Метод вызывается для перемещения окна
// при обработке щелчка на кнопке "Да" или
// выборе пункта меню "Подтверждаю": void handler(){
// Изменение позиции окна:
setLocation(getX()+step[0],getY()+step[1]); }
}
// Класс обработчика для щелчка на кнопке "Нет" или выбора
// пункта меню "Выход":
class HandlerNo implements ActionListener{
public void actionPerformed(ActionEvent ae){
// Завершение работы программы:
System.exit(0);}
}
// Класс обработчика для щелчка на кнопке "Да" или выбора
// пункта меню "Подтверждаю":
class HandlerYes implements ActionListener{
// Ссылка на объект окна, в котором расположена кнопка:
private MyFrame frame;
// Конструктор класса:
HandlerYes(MyFrame frame){
// Присваивание значения ссылке:
this.frame=frame;}
public void actionPerformed(ActionEvent ae){
// Вызов метода handler() для обработки события:
frame.handler();}
}
// Класс обработчика для выбора пунктов меню
// "По горизонтали" и "По вертикали":
class MenuHandler implements ActionListener{
// Ссылка на объект окна, в котором размещена панель меню:
private MyFrame frame;
// Логическое поле, определяющее, какое из двух меню используется:
private boolean dir;
// Конструктор класса.
// Аргументы - ссылка на объект окна и логический
// параметр, определяющий одно из двух меню
// (true - меню "По горизонтали" и false - меню "По вертикали"): MenuHandler(MyFrame frame,boolean dir) {
// Присваивание значения ссылке:
this.frame=frame;
// Присвоаивание значения логическому параметру:
this.dir=dir;}
// Переопределение метода для обработки выбора пункта меню:
public void actionPerformed(ActionEvent ae){
// Считывание команды действия:
String cmd=ae.getActionCommand();
// Реакция на выбор меню:
If (dir){
frame.move.HLab.setText(cmd.toLowerCase()) ;
if (cmd.equalsIgnoreCase("Вправо")) frame.setH(50);
else if(cmd.equalsIgnoreCase("Влево")) frame.setH(-50); else frame.setH(0);}
else {
frame.move.VLab setText(cmd.toLowerCase()); if(cmd.equalsIgnoreCase("Вверх")) frame.setV(-50); else if(cmd.equalsIgnoreCase("Вниз")) frame.setV(50); else frame.setV(0);}
} }
// Класс с главным методом программы:
public class MakeComponentsDemo{
public static void main(String[] args){
// Создание окна:
new MyFrame(" Служба перемещения окна \"Быстрый Заяц\”…”,380,180);
}}
Первым описывается класс MyButton, который наследует библиотечный класс JButton и представляет собой описание кнопки пользовательского типа. У этого класса есть закрытое поле frame класса MyFrame. Класс MyFrame описывается далее. Это класс окна пользовательского типа. Здесь поле frame необходимо в качестве ссылки на то окно, в которое будет добавляться кнопка. Представленный класс кнопки описывает как кнопку, с помощью которой перемещается окно (кнопка Да), так и кнопку, предназначенную для завершения работы программы (кнопка Нет). Поэтому у конструктора класса два аргумента: ссылка на окно, в которое добавляется кнопка, и аргумент логического типа, определяющий тип кнопки (значение true соответствует кнопке Да, а значение false соответствует кнопке Нет). Кроме ряда банальных команд, в конструкторе для записи имени файла изображения, которое используется для отображения в кнопке, создается текстовая переменная fileName. Текст с именем кнопки записывается в переменную bName. Заполнение этих переменных зависит от того, какая кнопка создается. Поэтому вся процедура реализуется через условный оператор, в котором проверяется значение второго, логического аргумента конструктора. В этом же условном операторе в создаваемой кнопке регистрируется обработчик щелчка на кнопке. Для кнопки Да регистрация выполняется командой addActionListener(new HandlerYes(frame)), а для кнопки Нет обработчик регистрируется командой addActionListener (new HandlerNо()). Здесь следует сказать, что обработчики для каждой из кнопок, а также пунктов меню реализуются в виде отдельных классов (реализующих интерфейс ActionListener). Для кнопки Да обработчик создается как объект класса HandlerYes. У конструктора класса есть аргумент - ссылка на объект окна. В данном случае при регистрации обработчика для кнопки Да аргументом метода addActionListener () указывается анонимный объект класса HandlerYes. При создании этого объекта конструктору класса передается поле frame. Обработчик для кнопки Нет создается на основе класса HandlerNo. Конструктору этого класса аргументы передавать не нужно.
Командой fileName="d:\\books\\files\\"+fileName выполняется формирование полного имени файла с изображением для кнопки. Для создания объекта изображения для кнопки используем команду Imagelcon icn=new Imagelcon (fileName). Затем с помощью команды setlcon(icn) это изображение применяется в качестве пиктограммы для кнопки. Название кнопки задается командой setText (bName). Отмена режима отображения рамки вокруг текста кнопки при передаче ей фокуса выполняется инструкцией setFocusPainted (false). Размеры кнопки определяем как int w=frame.getWidth ()/4 и int h=frame.getHeight()/8. Затем применяем их командой setSize(w, h). Координаты кнопки определяются командами int x=frame.getWidth()/4, y=frame.getHeight()-h-50 и if(!state) x+=w+50.
