Читайте также:
|
|
Мы уже сталкивались с классом JTabbedPane на 12-м занятии в примере Dlg3.java. Рассмотрим другой, более простой пример, чтобы познакомиться с этим классом подробнее.
Пример (файл Dlg6.java)
// Dlg6.java
// Визульное приложения с JTabbedPane.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Dlg6 extends JFrame {
Dlg6() {
super("Визульное приложения с JTabbedPane");
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e) {
}
setSize(400, 200);
Container c = getContentPane();
JTabbedPane tp = new JTabbedPane();
c.add(tp, BorderLayout.CENTER);
JPanel pn1 = new JPanel();
tp.add(pn1, "Hello");
JPanel pn2 = new JPanel();
tp.add(pn2, "Good-bye");
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);
setVisible(true);
}
public static void main(String[] args) {
Dlg6 d = new Dlg6();
}
}
Оттранслируем и запустим приложение. Приложение формирует такое окно
Рисунок 1.
Здесь две закладки, между которыми можно переключаться. Рассмотрим, как это реализовано. Сначала создается объект JTabbedPane и заносится в центр экрана
JTabbedPane tp = new JTabbedPane();
c.add(tp, BorderLayout.CENTER);
Потом создаются две панели pn1 и pn2 и добавляются на панель с закладками.
JPanel pn1 = new JPanel();
tp.add(pn1, "Hello");
JPanel pn2 = new JPanel();
tp.add(pn2, "Good-bye");
При этом применяется метод add с двумя параметрами, второй из которых содержит текст. Именно этот текст выводится на данной закладке. Количество закладок определяется количеством панелей добавленных к экземпляру класса JTabbedPane. Т.е. сформировать панели с закладками довольно просто.
Класс JTabbedPane имеет два конструктора
public JTabbedPane()
Конструктор по умолчанию. Формирует горизонтальную линейку закладок вверху.
public JTabbedPane(int tabPlacement)
Позволяет разместить закладки как горизонтально, так и вертикально, внизу и вверху панели. Соответствующие константы: TOP, BOTTOM, LEFT, RIGHT.
Попробуем в нашем приложении заменить конструктор по умолчанию на конструктор с параметром JTabbedPane.LEFT, т.е.
JTabbedPane tp = new JTabbedPane(JTabbedPane.LEFT);
Оттранслируем и посмотрим результат.
Каждая из закладок — это панель, на которую можно поместить свои визуальные компоненты. Это позволяет разместить на одном и том же участке экрана достаточно большое количество информации.
Воспользуемся этим для расширения возможностей нашего приложения с записной книжкой. Естественно, что фамилия и телефон, это очень мало и при формировании записной книжки может потребоваться другая информация.
Добавим на нашу записную книжку следующую информацию:
Начальный вариант класса Person для хранения всей этой информации выгладит так.
// Person.java
import java.io.*;
import java.util.Date;
public class Person implements Comparable,Serializable {
/**
* "Фамилия"
*/
private String lastName = null;
/**
* "Имя"
*/
private String firstName = null;
/**
* "Отчество"
*/
private String middleName = null;
/**
* "Отображать как" — изначально формируется как имя + фамилия,
* но потом можно изменить
*/
private String displayName = null;
/**
* "Псевдоним" — может быть пустым
*/
private String nickName = null;
/**
* "E-mail адрес(а)" — произвольное количество строк с e-mail адресами
*/
private String eMail = null;
/**
* "Пол" — мужской(м), женский(ж), не указан(н)
*/
private char gender = 'н';
/**
* "Дата рождения" — может быть не указана
*/
private Date birthday = null;
/**
* "Телефон"
*/
private String phone = null;
/**
* "Факс"
*/
private String facsimile = null;
/**
* "Мобильный"
*/
private String cellular = null;
/**
* "Дом, улица"
*/
private String streetAddr = null;
/**
* "Город"
*/
private String city = null;
/**
* "Штат/область"
*/
private String state = null;
/**
* "ZIP/Почтовый индекс"
*/
private String zip = null;
/**
* "Страна"
*/
private String country = null;
/**
* "Личная www-страница"
*/
private String homepage = null;
/**
* "Заметки"
*/
private String memo = null;
public Person() {
}
...
public int compareTo(Object another) {
return displayName.compareTo(((Person)another).displayName);
}
public String toString() {
return (displayName);
}
}
Как видим, результат (даже начальный) получился довольно внушительным. Следовательно, он требует к себе соответствующего внимания.
Сделаем два замечания.
Для бизнес-классов существует сложившаяся практика их построения и использования. Некоторые детали мы можем "прочувствовать" на нашем приложении.
Так, в предыдущих версиях приложения мы для построения нашего бизнес-объекта просто использовали конструктор
public Person(String name, String phone)
Это было сделано для упрощения, но сейчас такой вариант конструктора не подходит. В нем пришлось бы перечислить в качестве параметров все поля нашего класса, а это не очень удобно.
Поэтому в новой версии нашего приложения мы поступим следующим образом.
1. В качестве единственного конструктора будем использовать конструктор по умолчанию.
2. Все поля класса проинициализируем значением null.
3. Для каждого поля напишем два метода доступа (getter и setter), которые позволят выбирать значение поля (метод get<имя_поля>()) и заносить информацию в поле (метод set<имя_поля>(...)).
4. В главном классе приложения введем поле curObject:
private Person curObject;
5. При выборе строки списка в curObject будем заносить ссылку на объект Person, соответствующий данной строке.
6. При вводе новой записи по кнопке "Новая запись" будем создавать пустой объект Person и ссылку на него заносить в curObject.
7. Для каждого поля на экране реализуем слушателя, который будет заносить значение этого поля в curObject при помощи соответствующего метода set<имя_поля>(...).
Приведем пример нескольких get- и set-методов для класса Person
public String getEMail() {
return eMail;
}
public void setEMail(String eMail) {
this.eMail = eMail;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
Следует обратить внимание, что имена методов сформированы в соответствии с именами полей, а типы возвращаемых значений в get-методах и типы параметров в set-методах соответствуют типам полей.
Теперь, когда мы разобрались с общими принципами работы с полями в нашем приложении, вернемся к проблеме размещения всей этой информации на экране.
Требуется реализовать приложение так, чтобы экран выглядел следующим образом
1-я закладка
Рисунок 2.
2-я закладка
Рисунок 3.
3-я закладка
Рисунок 4.
По сравнению с предыдущей версией здесь кнопка "Новая запись" перенесена в левую панель и рядом добавлена кнопка "Удалить запись". Это позволило освободить пространство в правой панели. Кроме того, в данном варианте более естественным является диалог, в котором мы по кнопке "Новая запись" не переходим в режим создания новой записи (в предыдущей версии для этого служил флажок newMode), а сразу добавляем пустую запись в конец списка, а потом ее редактируем. Поэтому кнопки добавления/удаления записей более естественно поместить в панель, где находится список.
При добавлении новой записи нужно только учесть случай, когда идет попытка повторного добавления пустой записи. Для этого достаточно проверить, что в последней записи displayName не null. В диалоге пустую запись лучше отображать специальной строкой, например, (---???---). Изменим для этого метод toString в классе Person:
public String toString() {
return (displayName == null? "---???---": displayName);
}
Дата добавления: 2015-08-18; просмотров: 126 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Аплеты и приложения | | | Базовые средства RTTI |