Работа с формами и меню в Java

Цель занятия

Изучить основные принципы работы с формами, научиться использовать горизонтальные и всплывающие меню. Рассмотреть способы обработки событий от элементов меню. Научиться создавать и вызывать вспомогательные формы. Следует вспомнить материал главы /, посвященный обработке событий от мыши и клавиатуры, а также разработке визуального интерфейса (см. главы 1, 2). Дополнительные сведения следует искать в [2, 11, 13, 15, 17].

Краткие теоретические сведения

Рассмотрим сначала, как создавать горизонтальное меню. Панель меню объявляется в приложении с помощью класса MenuBar. Элементы горизонтального меню объявляются как объекты класса Menu и добавляются на панель MenuBar. Пункты меню являются членами класса Menuitem и добавляются в соответствующие элементы меню Menu. Обработка событий, связанных с выбором пунктов меню, выполняется на основе прослушивателя ActionListener так же, как и от кнопок. Для этих же целей можно задействовать метод action ().

Прежде всего, создадим меню в конструкторе класса так, как показано далее:

import java.awt.*; import java.util.*;

import java.lang.*;

public class Forma extends Frame {

MenuBar mb = new MenuBar();

Menu ml=new Menu("Operations");

Menu m2=new Menu("TheEnd");

Forma ()

{

ml.add(new MenuItem("Show")); m2.add(new MenuItem("Quit")); mb.add(ml); mb.add(m2); setMenuBar(mb);

setBackground(new Color(200,20,100));

}

Как видно, меню определяется через компоненты MenuBar, Menu, Menuitem. Последние генерируют событие при их выборе и допускают обработку. Обработчик событий от пунктов меню с именами Quit и Show:

public boolean action (Event evt, Object ob)

{

String lbl=(String) ob; if (lbl.equals("Quit"))

{

System.exit(0) ; return true;

else

{

if (lbl.equals("Show"))

{

Framemenu fr= new Framemenu(); fr.resize(300, 300); fr.show(); return true;

}

}

return false;

}

Метод public boolean action(Event evt, Object ob) является универсальным (позволяет обрабатывать события и от программных кнопок, и от других компонентов). Его следует запомнить. Аргументами этого метода являются имя события и объект, сгенерировавший событие. В тексте метода проверяется, от какого объекта возникло событие.

Следующие строки кода показывают, как конструируются (создаются) объекты в Java:

Framemenu fr= new Framemenu(); fr.resize(300,300); fr.show();

Framemenu — это имя класса, который имеет такое описание:

class Framemenu extends Frame {

Button ex=new Button("Return");

Framemenu () { add (ex) ;

setLayout(null); ex.setBounds(20,40,100, 20) ; setBackground(new Color(100,60,120));

В классе Framemenu определены два метода.

public void paint(Graphics g)

g.drawString("Hello, Dears!", 120,100);

public boolean action (Event evt, Object ob)

String lb=(String) ob; if (lb.equals("Return")) dispose(); return true;

Метод paint () используется для вывода текстовой строки, метод action() — обработчик событий; в данном случае при нажатии на кнопку Return вызывается метод dispose (), который удаляет вспомогательную форму.

Таким образом, на главной форме создано меню, которое позволяет запускать вспомогательную форму. Полный текст приложения (листинг 2.9) приведен далее.

Листинг 2.9. Текст приложения для работы с горизонтальным меню

import java.awt.*; import java.util.*; import java.lang.*;

public class Forma extends Frame

MenuBar mb = new MenuBar();

Menu ml=new Menu("Operations");

Menu m2=new Menu("TheEnd");

Forma ()

{

// Пункт мешо для демонстрации вспомогательной формы: ml.add(new MenuItem("Show"));

// Пункт мешо для завершения приложения: m2.add(new MenuItem("Quit")); mb.add(ml); mb.add(m2); setMenuBar(mb) ;

setBackground(new Color(200,20,100));

}

public boolean action (Event evt, Object ob)

{

String lbl=(String) ob; if (lbl.equals("Quit"))

{

System.exit(0) ; return true;

}

else

{

if (lbl.equals("Show"))

{

Framemenu fr= new Framemenu(); // Создаем

// вспомогательную форму

fr.resize(300,300);

fr.show(); // Делаем вспомогательную форму видимой return true;

}

}

return false;

public static void main(String args[])

{

Forma f=new Forma(); f. resize (400, 400) ;

f.     show();

}

}

class Framemenu extends Frame // Класс вспомогательной формы {

Button ex=new Button("Return");

Framemenu()

{

add (ex) ;

setLayout(null) ; ex.setBounds(20,40,100,20); setBackground(new Color(100,60,120));

}

public void paint(Graphics g)

{

g.                drawString("Hello, Dears!", 120,100);

}

public boolean action (Event evt, Object ob)

{

String lb=(String) ob; if (lb.equals("Return")) dispose(); return true;

}

}

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

ActionListener И MouseListener. Интерфейс MouseListener используется для его отображения, которое выполняется на основе метода pressMouseEvent () следующим образом:

public void pressMouseEvent(MouseEvent ev)

{

if(ev.isPopupTrigger())

menu.show(ev.getComponent(), ev.getX(), ev.getY()); super.processMouseEvent(ev);

}

В этом фрагменте menu — программное имя всплывающего меню (переменной класса PopupMenu). Метод getcomponent() класса MouseEvent возвращает объект, создавший событие ev; метод getx () возвращает координату по оси X курсора мыши в момент генерации события, а метод getY () — координату по оси Y. Последняя команда приведенного фрагмента выполняет вызов метода processMouseEvent () суперкласса.

Обработка событий, связанных с выбором пунктов всплывающего меню, реализуется традиционным образом через интерфейс ActionListener. Всплывающее меню добавлено на форму в тексте конструктора.

Forma ()

{

setLayout(null);

add(exit); // Добавлена кнопка для выхода из приложения addMouseListener(this); // Добавлен прослушиватель

// MouseListener для формы add(menu); // Добавлено всплывающее меню menu.add(itl); // Присоединение пунктов itl и it2 menu.add(it2);

itl.addActionListener(this); // Добавление прослушивателя

// для пунктов всплывающего меню

it2.addActionListener(this);

enableEvents(AWT.MOUSE_EVENT_MASK); // Активизация событий от

// мыши

exit.addActionListener(this); // Добавление прослушивателя

// для кнопки

exit.setBounds(10,20,100,20); // Установка размеров и

// координат кнопки

Приведем код программы, в которой показан пример создания всплывающего меню (листинг 2.10).

Листинг 2.10. Текст приложения для работы со всплывающим меню

import java.awt.*; import java.util.*; import java.lang.*; import java.awt.event.*;

public class Forma extends Frame implements ActionListener, MouseListener

Button exit=new Button("Exit");

PopupMenu menu= new PopupMenu("pop"); // Создается

// всплывающее меню MenuItem itl= new MenuItem("Show"); // Используется для

// открытия

// вспомогательной формы MenuItem it2= new MenuItem("Quit"); // Используется для

// выхода из приложения

Forma()     //Конструктор

setLayout(null); add(exit);

addMouseListener(this); // Добавление прослушивателя для

// формы

add(menu);

menu.add(itl); // Добавление пунктов во всплывающее меню menu.add(it2); // Добавление пунктов во всплывающее меню

itl.addActionListener(this); // Добавление прослушивателя

// для пунктов всплывающего / / мешо

it2.addActionListener(this) ;

enableEvents(AWTEvent.MOUSE_EVENT_MA.SK); // Активизация

// событий от мыши

exit.addActionListener(this); exit.setBounds(10,20,100,20);

}

public void mouseEntered(MouseEvent ev) // Приведенные методы

// интерфейса // MouseListener // не реализованы

{}

public void mouseExited(MouseEvent ev)

{}

public void mousePressed(MouseEvent ev)

{}

public void mouseReleased(MouseEvent ev) // Всплывающее меню

// нужно создавать // в этом методе

{

if(ev.isPopupTrigger())

menu.show(ev.getComponent(), ev.getX(), ev.getY());

// Отобразить // всплывающее меню

}

public void mouseClicked(MouseEvent ev)

{

}

public void actionPerformed(ActionEvent e)

{

if(e.getSource()==exit)

{

System.exit(0) ;

else

{

if (e.getSource()=itl) // Выбран пункт itl всплывающего

// меню

{

setBackground(Color.yellow);

Framemenu fr= new Framemenu(); // Создаем

// вспомогательную форму

fr.resize(300,300);

fr.show(); // Делаем вспомогательную форму видимой

}

}

}

public static void main(String args[])

{

Forma f=new Forma(); f. resize (400, 400) ;

f.setBackground(new Color(100,60,120));

f.show();

}

}

class Framemenu extends Frame // Класс вспомогательной формы {

Button ex=new Button("Return");

Framemenu()

{

add (ex) ;

setLayout(null) ; ex.setBounds(20,40,100,20);

public void paint(Graphics g)

{

g.                drawString("Hello, Dears!", 120,100);

}

public boolean action (Event evt, Object ob)

{

String lb=(String) ob; if (lb.equals("Return")) dispose(); // Закрываем и удаляем вспомогательную форму return true;

}

}

Обратим внимание на следующее:

□      всплывающее меню относится к классу PopupMenu

□   его                                                                        пункты           обрабатываются с помощью метода

actionPerformed()

□      само меню нужно показать командой:

menu.show(ev.getComponent(), ev.getX(), ev.getY())

□   эту                                                                       команду           следует поместить в обработчик

mouseReleased().

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100