Приложение 2. Контейнер Dialog



Цель работы

 

1. Познакомиться с сериализацией объектов и её практическим применением.

2. Изучить метод клонирования объектов при помощи сериализации.

3. Освоить классы ObjectInputStream и ObjectOutputStream пакета java.io.

4. Научится обрабатывать действия мыши и клавиатуры.

5. Изучить классы Menu, MenuBar, MenuItem, Dialog, FileDialog пакета java.awt.

6. Научиться использовать таблицы.

7. Применить полученные знания на практике

 

Задание для домашней подготовки

 

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

 

Задание к лабораторной работе

 

Создать оконное приложение, реализующее графический интерфейс доступа к массиву объектов классов Employee и Manager (см. приложение). Работа пользователя должна осуществляться при помощи меню, обязательно содержащего следующие элементы.

– Меню «Файл» (Внутри – пункты меню «Новый каталог», «Сохранить данные», «Загрузить данные», «Передать данные»).

– Меню «Добавить (Внутри – пункты меню «Новый работник», «Новый менеджер», «Клонировать сотрудника»).

Добавление информации о новых сотрудниках должно происходить при помощи диалоговых окон.

На главной форме должна присутствовать таблица с информацией о сотрудниках (Ф.И.О., оклад, дата поступления).

Ниже описываются действия программы на выбор соответствующих пунктов меню.

Меню «ФАЙЛ»

«Новый каталог» – вся информация в таблице стирается. На экране показываются только заголовки таблицы.

«Сохранить данные» – объект базы данных сериализуется в файл. Внутри объекта данных для этого должен быть предусмотрен соответствующий метод.

«Загрузить данные» – объект базы данных десериализуется из файла. Внутри объекта данных для этого должен быть предусмотрен соответствующий метод.

«Выход» – вызов системного метода System.exit(0).

Меню «ДОБАВИТЬ»

«Добавить работника» – показывается диалоговое окно, в котором пользователь может ввести данные для нового работника. Эти данные заносятся в объект базы данных, после чего обновляется информация в таблице.

«Добавить менеджера» – аналогично предыдущему пункту, но с учётом особенностей класса Manager. Класс диалогового окна добавления менеджера может быть наследован от аналогичного класса окна Employee.

«Клонировать сотрудника» – под этим необычным названием скрывается стандартное копирование записи базы данных, которое осуществляется методом клонирования сериализацией (см. приложение). Копия добавляется в конец таблицы. Выбор записи для копирования осуществляется выделением соответствующего поля в таблице.

 

Рисунок 1: Вариант исполнения задания

Содержание отчета

 

Отчет должен содержать:

1. Постановку задачи, решаемой отлаженной программой.

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

3. Листинг программы с необходимыми комментариями.

 

Контрольные вопросы

 

1. Что такое сериализация / десериализация?

2. Какое диалоговое окно называется модальным?

3. Почему не все объекты можно сериализовать?

4. Как узнать, можно ли сериализовать объект класса, встроенного в Java?

5. Почему возможность сериализации сохраняется при наследовании?

6. Сколько полей содержит интерфейс Serializable?

7. Что подразумевается под термином «клонирование объектов».

8. Назовите «родственные связи» между классами Menu, MenuItem, MenuBar, MenuShortCut и MenuComponent.

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

10. Как заставить приложение записывать на экране в текстовой области символы ‘*’ вместо символов, вводимых с клавиатуры?

11. Что такое «модель таблицы»?

12. Где хранятся данные для таблицы?

13. Какие данные могут содержать ячейки таблицы JTable?

14. Как сделать возможным выбор нескольких элементов таблицы.

Литература

 

Официальные источники:

1. Кен Арнольд, Джеймс Гослинг, Дэвид Холмс. Язык программирования Java™.

2. Официальный сайт Java – http://java.sun.com/ (есть раздел на русском языке с учебником).

3. Java™ 2 SDK, Standard Edition Documentation – http://java.sun.com/products/jdk/1.5/index.html.

4. Джеймс Гослинг, Билл Джой, Гай Стил. Спецификация языка Java (The Java Language Specification – http://www.javasoft.com/docs/books/jls/). Перевод на русский язык – http://www.uni-vologda.ac.ru/java/jls/index.html

5. Официальный сайт проекта Eclipse – http://www.eclipse.org/.

Другое:

1. Дмитрий Рамодин. Начинаем программировать на языке Java.

2. Николай Смирнов. Java 2: Учебное пособие.

3. Картузов А.В. Программирование на языке Java.

4. Вязовик Н.А. Программирование на Java.

5. Алексей Литвинюк. Введение в интегрированную среду разработки Eclipse – http://lib.juga.ru/article/articleview/174/1/69/.

 


Приложение 1. Создание меню

 

В контейнер типа Frame заложена возможность установки стандартной строки меню(menu bar), располагаемой ниже строки заголовка, как показано на рисунке 1. Эта строка – объект класса MenuBar.

Все, что нужно сделать для установки строки меню в контейнере Frame – это создать объект класса MenuBar и обратиться к методу setMenuBar():

Frame f = new Frame («Пример меню»);

MenuBar mb = new MenuBar();

f.setMenuBar(mb);

Если имя mb не понадобится, можно совместить два последних обращения к методам:

f.setMenuBar (new MenuBar());

Разумеется, строка меню еще пуста и пункты меню не созданы.

Каждый элемент строки меню – выпадающее меню(drop-down menu) – это объект класса Menu. Создать эти объекты и занести их в строку меню ничуть не сложнее, чем создать строку меню:

Menu mFile = new Menu («Файл»);

mb.add(mFile);

Menu mEdit = new Menu («Правка»);

mb.add(mEdit);

Menu mView = new Menu («Вид»);

mb.add(mView);

Menu mHelp = new Menu («Справка»);

mb.setHelpMenu(mHelp);

и т.д. Элементы располагаются слева направо в порядке обращений к методам add(), как показано на рисунке 1. Во многих графических системах принято меню Справка (Help) прижимать к правому краю строки меню. Это достигается обращением к методу setHelpMenu(), но фактическое положение меню Справка определяется графической оболочкой.


Рисунок 2. Система меню

 

Затем определяем каждое выпадающее меню, создавая его пункты. Каждый пункт меню – это объект класса MenuItem. Схема его создания и добавления к меню точно такая же, как и самого меню:

MenuItem create = new MenuItem («Создать»);

mFile.add(create);

MenuItem open = new MenuItem («Открыть…»);

mFile.add(open);

и т.д. Пункты меню будут расположены сверху вниз в порядке обращения к методам add().

Часто пункты меню объединяются в группы. Одна группа от другой отделяется горизонтальной чертой. На рисунке 1 черта проведена между командами Открыть и Отправить. Эта черта создается методом addSeparator() класса Menu или определяется как пункт меню с надписью специального вида – дефисом:

mFile.add (new MenuItem(» –»));

Интересно, что класс Menu расширяет класс MenuItem, а не наоборот. Это означает, что меню само является пунктом меню, и позволяет задавать меню в качестве пункта другого меню, тем самым организуя вложенные подменю:

Menu send = new Menu («Отправить»);

mFile.add(send);

Здесь меню send добавляется в меню mFile как один из его пунктов. Подменю send заполняется пунктами меню как обычное меню.

Часто команды меню создаются для выбора из них каких-то возможностей, подобно компонентам checkbox. Такие пункты можно выделить щелчком кнопки мыши или отменить выделение повторным щелчком. Эти команды – объекты класса CheckboxMenuItem:

CheckboxMenuItem disk = new CheckboxMenuItem («Диск A:», true);

send.add(disk);

send.add (new CheckboxMenuItem («Архив»));

и т.д.

Все, что получилось в результате перечисленных действий, показано на рисунке 1.

Многие графические оболочки, но не MS Windows, позволяют создавать отсоединяемые(tear-off) меню, которые можно перемещать по экрану. Это указывается в конструкторе

Menu (String label, boolean tearOff)

Если tearoff == true и графическая оболочка умеет создавать отсоединяемое меню, то оно будет создано. В противном случае этот аргумент просто игнорируется.

Наконец, надо назначить действия командам меню. Команды меню типа MenuItem порождают события типа ActionEvent, поэтому нужно присоединить к ним объект класса-слушателя как к обычным компонентам, записав что-то вроде

create.addActionListener (new SomeActionEventHandler())

open.addActionListener (new AnotherActionEventHandler())

Пункты типа CheckboxMenuItem порождают события типа ItemEvent, поэтому надо обращаться к объекту-слушателю этого события:

disk.addItemListener (new SomeItemEventHandler())

Очень часто действия, записанные в командах меню, вызываются не только щелчком кнопки мыши, но и «горячими» клавишами-акселераторами (shortcut), действующими чаще всего при нажатой клавише <Ctrl>. На экране в пунктах меню, которым назначены «горячие» клавиши, появляются подсказки вида Ctrl+N, Ctrl+O, как на рисунке 1. «Горячая» клавиша определяется объектом класса MenuShortcut и указывается в его конструкторе константой класса KeyEvent, например:

MenuShortcut keyCreate = new MenuShortcut (KeyEvent.VK_N);

После этого «горячей» будет комбинация клавиш <Ctrl>+<N>. Затем полученный объект указывается в конструкторе класса MenuItem:

MenuItem create = new MenuItem («Создать», keyCreate);

Нажатие <Ctrl>+<N> будет вызывать окно создания. Эти действия, разумеется, можно совместить, например,

MenuItem open = new Menultern («Открыть…»,

new – MenuShortcut (KeyEvent.VK_O));

Можно добавить еще нажатие клавиши <Shift>. Действие пункта меню будет вызываться нажатием комбинации клавиш <Shift>+<Ctrl>+<X>, если воспользоваться вторым конструктором:

MenuShortcut (int key, boolean useShift)

С аргументом useShift == true.

 

Пример создания меню

 

import java.awt.*;

import java.awt.event.*;

public class MenuScribble extends Frame {

public MenuScribble (String s) {

super(s);

MenuBar mb = new MenuBar();

setMenuBar(mb);

Menu f = new Menu («Файл»);

Menu h = new Menu («Справка»);

mb.add(f);

mb.add(h);

MenuItem open = new MenuItem («Открыть…»,

new MenuShortcut (KeyEvent.VK_0));

MenuItem save = new MenuItem («Сохранить»,

new MenuShortcut (KeyEvent.VK_S));

MenuItem saveAs = new Menultera («Сохранить как…»);

MenuItem exit = new MenuItem («Выход»,

new MenuShortcut (KeyEvent.VK_Q));

f.add(open);

f.add(save);

f.add(saveAs);

f.addSeparator();

f.add(exit);

open.addActionListener (new ActionListener() {

public void actionPerformed (ActionEvent e) {

FileDialog fd = new FileDialog (new Frame(),

«Загрузить», FileDialog.LOAD);

fd.setVisible(true);

}

});

saveAs.addActionListener (new ActionListener() {

public void actionPerformed (ActionEvent e) {

FileDialog fd = new FileDialog (new Frame(),

«Сохранить», FileDialog.SAVE);

fd.setVisible(true);

}

});

exit.addActionListener (new ActionListener() {

public void actionPerformed (ActionEvent e) {System.exit(0);}

});

MenuItem about = new MenuItem («О программе»);

h.add(about);

about.addActionListener (

// …обработчик

);

addWindowListener (new WinClose());

setVisible(true);

} // конец конструктора

// вложенный класс – обработчик события закрытия окна

class WinClose extends WindowAdapter {

public void windowClosing (WindowEvent e) {System.exit(0);}

}

public static void main (String[] args) {

new MenuScribble («Программа с меню»);

}

}


Приложение 2. Контейнер Dialog

 

Контейнер Dialog – это окно обычно фиксированного размера, предназначенное для ответа на сообщения приложения. Оно автоматически регистрируется в оконном менеджере графической оболочки, следовательно, его можно перемещать по экрану, менять его размеры. Но окно типа Dialog, как и его суперкласс – окно типа Window, – обязательно имеет владельца owner, который указывается в конструкторе. Окно типа Dialog может быть модальным(modal), в котором надо обязательно выполнить все предписанные действия, иначе из окна нельзя будет выйти.

В классе семь конструкторов. Из них:

· Dialog (Dialog owner) – создает немодальное диалоговое окно с пустой строкой заголовка;

· Dialog (Dialog owner, String title) – создает немодальное диалоговое окно со строкой заголовка title;

· Dialog (Dialog owner, String title, boolean modal) – создает диалоговое окно, которое будет модальным, если modal == true.

Четыре других конструктора аналогичны, но создают диалоговые окна, принадлежащие окну типа Frame:

Dialog (Frame owner)

Dialog (Frame owner, String title)

Dialog (Frame owner, boolean modal)

Dialog (Frame owner, String title, boolean modal)

Среди методов класса интересны методы: isModal(), проверяющий состояние модальности, и setModal (boolean modal), меняющий это состояние.

События

Кроме Событий класса Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при изменении размеров окна, его перемещении или удалении с экрана, а также показа на экране происходит событие WindowEvent.

В примере 1 создается модальное окно доступа, в которое вводится имя и пароль. Пока не будет сделан правильный ввод, другие действия невозможны. На рисунке 2 показан вид этого окна.

Пример 1. Модальное окно доступа

import java.awt.*;

import java.awt.event.*;

class LoginWin extends Dialog {

LoginWin(Frame f, String s) {

super (f, s, true);

setLayout(null);

setFont (new Font («Serif», Font.PLAIN, 14));

Label l1 = new Label («Ваше имя:», Label.RIGHT);

l1.setBounds (20, 30, 70, 25); add(l1);

Label l2 = new Label («Пароль:», Label.RIGHT);

l2.setBounds (20, 60, 70, 25); add(l2);

TextField tf1 = new TextField(30);

tf1.setBounds (100, 30, 160, 25); add(tf1);

TextField tf2 = new TextField(30);

tf2.setBounds (100, 60, 160, 25); add(tf2);

tf2.setEchoChar ('*');

Button b1 = new Button («Применить»);

b1.setBounds (50, 100, 100, 30); add(b1);

Button b2 = new Button («Отменить»);

b2.setBounds (160, 100, 100, 30); add(b2);

setBounds (50, 50, 300, 150);

}

}

class DialogTest extends Frame {

DialogTest(String s) {

super(s);

setLayout(null);

setSize (200, 100);

setVisible(true);

Dialog d = new LoginWin (this, «Окно входа»);

d.setvisible(true);

}

public static void main (String[] args) {

Frame f = new DialogTest (» Окно-владелец»);

f.addWindowListener (new WindowAdapter() {

public void windowClosing (WindowEvent ev) {

System.exit(0);

}

});

}

}

 

Рисунок 2. Модальное окно доступа

 


Дата добавления: 2019-07-15; просмотров: 203; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!