- •Обозначения и сокращения
- •Введение
- •1 Простое SWT приложение
- •1.1 Создание приложения
- •1.2 Запуск SWT программы из командной строки
- •1.3 Структура приложения
- •1.4 Слушатели событий
- •1.5 Работа с подпроцессами
- •1.5.1 Диспетчеризация внутренних событий
- •1.5.2 Нить пользовательского интерфейса SWT
- •1.5.3 Выполнение кода за пределами нити UI
- •1.5.4 Рабочая среда и нити
- •2 Элементы управления
- •2.1 Стандартные виджеты
- •2.2 Пользовательские виджеты
- •2.3 Класс Label
- •2.3.1 Стили
- •2.3.2 Текст
- •2.3.3 Изображение
- •2.3.4 Разделители
- •2.3.5 Выравнивание
- •2.3.6 Перенос слов текста
- •2.3.7 Пример использования этикеток
- •2.4 Класс Text
- •2.5 Класс Button
- •2.5.1 Стили
- •2.5.2 Текст
- •2.5.3 Изображение
- •2.5.4 Выравнивание
- •2.5.5 Push Button
- •2.5.6 Toggle Button
- •2.5.7 Check Box
- •2.5.8 Radio Button
- •2.5.9 Selection (выбор)
- •2.5.10 Указание используемой по умолчанию кнопки
- •2.6 Класс List
- •2.6.1 Стили
- •2.6.2. Добавление элементов в список
- •2.6.3. Удаление элементов из списка
- •2.6.4 Получение элементов списка
- •2.6.5 Настройка значений элементов
- •2.6.6 Поиск элементов
- •2.6.7 Выбор элементов списка
- •2.6.8 Обработка событий списка List
- •2.7 Класс Link
- •2.7.1 Стили
- •2.7.2. Текст
- •2.7.3. Обработчики событий
- •2.8 Класс Table
- •2.9 Класс TableColumn
- •2.10 Класс TableItem
- •2.11 Класс Item
- •2.12 Класс Combo
- •2.13 Класс FileDialog
- •2.14 Класс Menu
- •2.15 Класс MenuItem
- •2.16 Класс MessageBox
- •2.17 Класс TabFolder
- •2.18 Class TabItem
- •3 Макеты
- •3.1 Класс FillLayout
- •3.2 Класс GridLayout
- •3.3 Класс GridData
- •3.4 Класс RowLayout
- •3.5 Класс RowData
- •3.6 Класс FormLayout
- •3.7 Класс FormAttachment
- •3.8 Класс FormData
- •4 Графика
- •4.1 Класс GC
- •4.2 Класс Canvas
- •5 Пакет printing
- •5.1 Класс PrintDialog
- •5.2 Класс Printer
- •5.3 Класс PrinterData
- •6 Пакет events
- •6.1 Класс Event
- •7 Разработка приложений
- •8 Разработка новых компонент
- •9 Дополнительные возможности библиотеки SWG
- •9.1 Компоненты управления
- •9.2 Виджеты
- •9.3 Плоские формы
- •9.4 Линии, точки и ломанные
- •9.5 Класс PathShape
- •10 Анимация
- •10.1 Типы анимации
- •10.2 Анимация во времени
- •10. 3 Поддержка времени
- •10.4 Пример приложения с элементами анимации
- •Список использованных источников
7 Разработка приложений
Для иллюстрации некоторых приемов программирования приложений с использованием библиотеки SWT приведем пример программы для построения графика простого полинома произвольной степени. Все исходные данные вводятся в диалоге с конечным пользователем, могут быть сохранены в файле и прочитаны обратно. Предусмотрена проверка корректности задания исходных данных. Если данные верны, то строится таблица значений и сам график, который может быть направлен на печать. Управление работой приложения производится с использованием меню. Главное окно содержит блокнот, на закладках которого расположены необходимые элементы для работы приложения (рисунок 7.1).
Рисунок 7.1 – Интерфейсы приложения
134
На закладке «Исходные данные» размещены средства ввода необходимой информации. На закладке «Таблица» размещаются результаты расчета значений функции для заданных аргументов. Закладка «График» предназначена для построения графика функции. Закладка «Неполадки» предназначена для отображения сообщений об обнаруженных во время работы проблемах.
Разработку приложения будем производить в среде Eclipse. Для этого создадим проект с именем «Проект», а в нем пакет с тем же именем. В пакете создадим программу на языке Java с именем «MainProg». Обычно разработку прикладной программы начинают с проектирования и отладки интерфейсов с пользователем. Далее создают объекты – слушатели, обработчики событий, наполняя их соответствующей функциональностью. Ниже приведен текст программы на языке Java, в полном объеме решающий поставленную задачу.
Первая строка создается автоматически при задании параметров проекта, описанных в разделе 1.1. Строки 2 –11 указывают на использование различных библиотек классов языка Java и пакета SWT.
package Проект;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.program.*; import org.eclipse.swt.printing.*; import java.util.*;
import java.io.*;
public class MainProg {
Следующие строки описывают типы и классы значений используемых переменных, видимых во всех методах главной программы.
static Display display; |
// Дисплей |
|
static Shell shell; |
// Главное окно |
|
static Text nameGr; |
// Имя графика |
|
static Text nameX; |
// Имя оси Х |
|
static Text nameY; |
// Имя оси У |
|
static Text minXText; |
// Минимальное |
Х |
static double minX; |
|
|
static Text maxXText; |
// Максимальное Х |
|
static double maxX; |
|
|
static Text colXText; |
// Число точек |
графика |
static int colX; |
|
|
static Text kAText; |
// Коэффициенты полинома |
135
static |
Text errText; |
// Для сообщений |
static |
boolean isError = false; |
|
static |
boolean isVerify = false; |
|
static |
boolean isTable = false; |
|
static |
boolean isGraph = false; |
|
static |
double[ ] A, Xi, Yi; // Массивы коэффициентов и точек |
|
графика |
|
|
static |
Label errLabel; |
|
static |
Table table; |
// Таблица значений полинома |
static |
TableColumn columnX; // Столбцы таблицы |
|
static |
TableColumn columnY; |
|
static |
String fileName; |
// Имя файла для сохранения |
static |
FileWriter fOut; |
// Файл для записи |
static |
FileReader fIn; |
// Файл для чтения |
static |
Group grpGr; |
// Группа элементов для построения |
графика |
|
|
static |
int penW = 1; |
// Параметры пера для рисования |
static |
int penG = 2; |
|
//Для работы всплывающих подсказок необходимы ресурсы пакета в файле
//с именем help.properties
static |
Locale loc = new |
Locale("utf-8"); |
// utf-8 cp1251 |
static |
Image images[ ]; |
|
|
Объект с именем onHelp анонимного класса, но поддерживающий интерфейс Listener, что позволяет его использовать как обработчик событий. В данном контексте он загружает стороннюю службу помощи, передавая ей тот или иной вариант файла с текстами разделов.
static Listener onHelp = new Listener () { public void handleEvent (Event e) {
// Загрузить файл справки руководствуясь расширением html или
hlp
//Program.launch("MainGraphic.htm");
Program.launch("project.hlp");
}
};
Объект с именем onPrint анонимного класса, поддерживающий интерфейс Listener, что позволяет его использовать как обработчик событий выбора позиции меню для печати графика функции.
static Listener onPrint = new Listener () {
// Обработка команды меню "Печать графика" public void handleEvent (Event e) {
// Запрос установленного принтера по умолчанию PrinterData data = Printer.getDefaultPrinterData(); if (data == null) {
MessageBox msg = new MessageBox(shell,
SWT.ICON_QUESTION | SWT.OK); msg.setMessage("Предупреждение: Не определен принтер по
136
умолчанию");
msg.open();
//System.out.println("Warning: No default printer."); return;
} |
|
|
|
|
// Создать объект - принтер |
|
|
||
Printer |
printer = new Printer(data); |
|
|
|
if (printer.startJob("Graphic_1")) { |
|
|
||
Color |
black = printer.getSystemColor(SWT.COLOR_BLACK); |
|
||
Color |
white = printer.getSystemColor(SWT.COLOR_WHITE); |
|
||
Color |
red = printer.getSystemColor(SWT.COLOR_RED); |
|
|
|
Rectangle bnd = printer.getBounds(); |
|
|
||
Point |
dpi = printer.getDPI(); |
|
|
|
int leftMargin = dpi.x / 2 + bnd.x; // 1/2 дюйма слева |
int |
|||
topMargin |
= dpi.y / 2 + bnd.y; // 1/2 дюйма сверху |
GC gc = new |
||
GC(printer); |
// Получили графический контекст |
|
|
//Font font = gc.getFont(); // пример использования printer's default font
if (printer.startPage()) { // Принтер готов печатать страницу gc.setBackground(white);
gc.setForeground(black);
//gc.fillRectangle(bnd); //Можно не рисовать белый фон листа
//System.out.println(getWidthString(gc, "Пример"));
// Амплитуда по вертикали double minY = Yi[0]; double maxY = Yi[0];
for (int i = 1; i < colX; i++){
if (minY > Yi[i]) {minY = Yi[i];}; if (maxY < Yi[i]) {maxY = Yi[i];};
}; |
|
|
|
int w = bnd.width - 10 |
- dpi.x; |
|
|
int h = bnd.height - 15 |
- dpi.y; |
|
|
double scaleX = w / ((maxX - minX) * 1.10); |
// Масштаб |
||
по Х |
|
|
|
double scaleY = h / ((maxY - minY) * 1.10); |
// Масштаб |
||
по Y |
|
|
|
int x0 = (int)Math.floor((0 - minX) * scaleX) + leftMargin; |
|||
// Положение оси Y |
|
|
|
int y0 = (int)Math.floor(h - (0 - minY) * scaleY) + |
|||
topMargin; |
// Положение оси Х |
|
|
gc.setLineWidth (penW); |
|
|
gc.drawText(nameGr.getText(), |
w/2 - |
getWidthString(gc, |
||
nameGr.getText()) + leftMargin , 30 |
+ topMargin); // Имя графика |
|||
gc.drawText(nameX.getText(), w-20 + |
leftMargin, |
h-10 + |
||
topMargin); // Имя оси Х |
133 |
|
|
|
gc.drawText(nameY.getText(), 5 + leftMargin, 15 |
+ |
137
topMargin); |
// Имя оси Y |
|
|
|
|
|
double dx = (maxX |
- minX) / 5.0; |
// Шаг сетки |
по Х |
|||
double dy = (maxY |
- minY) / 5.0; |
// |
Шаг сетки |
по |
Y |
|
for (int i = 0; i |
< 6; i++){ |
// |
Рисуем шкалы |
и сетку |
double x = Math.floor(minX + dx*i); // Координата X
исходная
int x1 = (int)Math.floor((x - minX) * scaleX) + leftMargin; // Координата X на экране
Formatter fmtx = (new Formatter()); gc.drawText(fmtx.format("%.2f", x).toString(), x1, h + 1 +
topMargin); // Шкала по Х
gc.drawLine(x1, topMargin, x1, h + topMargin); // Сетка
по Х
double y = Math.floor(minY + dy*i); // Координата Y
исходная
int y1 = (int)Math.floor(h - (y - minY) * scaleY) + topMargin; // Координата Y на экране
Formatter fmty = (new Formatter()); gc.drawText(fmty.format("%.2f", y).toString(), 3 +
leftMargin, y1-20); // Шкала по Y
gc.drawLine(leftMargin, y1, leftMargin + w, y1); // Сетка
по Y
};
// Рисуем график
x0 = (int)Math.floor((Xi[0] - minX) * scaleX) + leftMargin;
//Задаем начальную точку
y0 = (int)Math.floor(h - (Yi[0] - minY) * scaleY) +
topMargin; |
|
|
gc.setLineWidth (penG); |
// Перо для графика |
|
gc.setForeground(red); |
// Цвет для графика |
|
for (int i = 1; i < colX; i++){ |
// По точкам графика |
int x1 = (int)Math.floor((Xi[i] - minX) * scaleX) + leftMargin;
int y1 = (int)Math.floor(h - (Yi[i] - minY) * scaleY) + topMargin;
gc.drawLine(x0, y0, x1, y1);
x0 = x1; y0 = y1; |
// Меняем начальную точку |
|
}; |
|
|
printer.endPage(); |
|
|
} |
|
|
gc.dispose(); |
// Освободили графический контекст |
|
printer.endJob(); |
// Закрыли зададание на печать 147 |
|
} |
|
|
printer.dispose(); |
// Закрыли принтер |
}
};
138
Объект с именем onExit анонимного класса, поддерживающий интерфейс Listener, что позволяет его использовать как обработчик событий выхода из приложения.
static Listener onExit = new Listener () {
// Обработка команды меню "Выход" public void handleEvent (Event e) {
shell.close();
}
};
Объект с именем onOpen анонимного класса, поддерживающий интерфейс Listener, что позволяет его использовать как обработчик команды открытия файла с ранее сохраненными в нем исходными данными.
static Listener onOpen = new Listener () {
// Обработка команды меню "Открыть файл" public void handleEvent (Event e) {
FileDialog dialog = new FileDialog (shell, SWT.OPEN); dialog.setFilterNames (new String [ ] {"Исходные данные", "Все
файлы (*.*)"});
dialog.setFilterExtensions (new String [ ] {"*.fun", "*.*"}); //Windows wild cards
dialog.setFilterPath ("c:\\user\\"); //Windows path dialog.setFileName ("test.fun");
fileName = dialog.open (); try {
fIn = new FileReader(fileName); BufferedReader br = new BufferedReader(fIn); nameGr.setText(br.readLine()); nameX.setText(br.readLine()); nameY.setText(br.readLine()); minXText.setText(br.readLine()); maxXText.setText(br.readLine()); colXText.setText(br.readLine());
String line; kAText.setText("");
while ((line = br.readLine()) != null ) {
//System.out.print(line + "-->" + line.length() + "\n"); if (line.length() > 0) {
kAText.append(line+"\n");
};
};
fIn.close();
}
catch (IOException eio) {
errText.append("Ошибка при чтении из файла " + fileName + "\n");
isError = true;
}
139
}
};
Объект с именем onSave анонимного класса, поддерживающий интерфейс Listener, что позволяет его использовать как обработчик команды сохранения в файле исходных данных, заданных пользователем в диалоге. static Listener onSave = new Listener () {
// Обработка команды меню "Сохранить файл" public void handleEvent (Event e) {
FileDialog dialog = new FileDialog (shell, SWT.SAVE); dialog.setFilterNames (new String [ ] {"Исходные данные", "Все
файлы (*.*)"});
dialog.setFilterExtensions (new String [ ] {"*.fun",
"*.*"}); //Windows wild cards
dialog.setFilterPath ("c:\\user\\"); //Windows path dialog.setFileName ("test.fun");
fileName = dialog.open (); try {
fOut = new FileWriter(fileName); fOut.write(nameGr.getText()+"\n"); fOut.write(nameX.getText()+"\n"); fOut.write(nameY.getText()+"\n"); fOut.write(minXText.getText()+"\n"); fOut.write(maxXText.getText()+"\n"); fOut.write(colXText.getText()+"\n"); fOut.write(kAText.getText()+"\n"); fOut.close();
}
catch (IOException eio) {
errText.append("Ошибка при записи в файл " + fileName + "\n"); isError = true;
}
}
};
Объект с именем onRevise анонимного класса, поддерживающий интерфейс Listener, что позволяет его использовать как обработчик команды поверки корректности исходных данных.
static Listener onRevise = new Listener () { // Обработка команды меню "Проверить данные" public void handleEvent (Event e) { errText.setText("");
isError = false; try {
minX = Double.parseDouble(minXText.getText());
}
catch (RuntimeException e1) {
//System.out.println("Ошибка в задании min X"); errText.append("Ошибка в задании min X \n");
140
isError = true;
};
try {
maxX = Double.parseDouble(maxXText.getText());
}
catch (RuntimeException e1) {
//System.out.println("Ошибка в задании min X"); errText.append("Ошибка в задании max X \n"); isError = true;
};
try {
colX = Integer.parseInt(colXText.getText());
}
catch (RuntimeException e1) {
//System.out.println("Ошибка в задании min X"); errText.append("Ошибка в задании количества точек X \n"); isError = true;
}; |
|
|
// Коэффициенты полинома a[i] |
|
|
try { |
|
|
String Astr = kAText.getText(); |
// Весь текст в окне |
|
StringTokenizer Ast = new StringTokenizer(Astr, "\n");// по |
||
строкам |
|
|
int |
n = Ast.countTokens(); |
// число строк |
A = |
new double[n]; |
|
int |
i = 0; |
|
while(Ast.hasMoreTokens()){
String line = Ast.nextToken(); if (line != null) {
A[i] = Double.parseDouble(line); i += 1; //System.out.print(line);
};
};
//System.out.println(A);
}
catch (RuntimeException e1) {
//System.out.println("Ошибка в задании min X"); errText.append("Ошибка в задании коэффициентов А[i]\n"); isError = true;
};
if (! isError) { errLabel.setForeground(display.getSystemColor
(SWT.COLOR_BLUE)); errLabel.setText("Все верно!"); isVerify = true;
141
}else { errLabel.setForeground(display.getSystemColor
(SWT.COLOR_RED)); errLabel.setText("Есть ошибки!"); isVerify = false;
};
isTable = false; isGraph = false;
}
};
Объект с именем onTable анонимного класса, поддерживающий интерфейс Listener, что позволяет его использовать как обработчик команды построения таблицы вычисленных значений графика.
static Listener onTable = new Listener () {
// Обработка команды меню "Построить график" public void handleEvent (Event e) {
//Удалить старые строки таблицы table.removeAll();
// Расчет и формирование строк таблицы значений функции if (!isVerify) {
MessageBox msg = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK);
msg.setMessage("Необходимо проверить исходные данные!");
|
msg.open(); |
|
|
return; |
|
}; |
|
|
Xi = new double[colX]; |
// Массив точек графика |
|
Yi |
= new double[colX]; |
|
double dlt = (maxX - minX) / (colX - 1); // Приращение по Х
int numA = A.length; |
// Число коэффициентов |
полинома |
|
for (int i = 0; i < colX; i++){ |
|
double x = minX + dlt * i; |
|
double y = A[0]; |
|
for (int j = 1; j < numA; j++){ |
|
y = y + A[j] * Math.pow(x, j); |
|
}; |
|
Xi[i] = x; Yi[i] |
= y; |
||
TableItem item = |
new TableItem (table, SWT.NONE); |
||
Formatter |
fmtx |
= |
(new Formatter()); |
item.setText (0, |
fmtx.format("%12.4g", x).toString()); |
||
Formatter |
fmty |
= |
(new Formatter()); |
item.setText (1, fmty.format("%12.4g", y).toString());
};
isTable = true; isGraph = true;
142
}
};
Объект с именем onGraph анонимного класса, поддерживающий интерфейс Listener, что позволяет его использовать как обработчик команды построения графика и обработки запросов на перерисовку при изменениях размеров и видимости окна.
static Listener onGraph = new Listener () {
// Обработка запроса на перерисовку графика public void handleEvent (Event e) {
//System.out.println(e.toString());
if ((isGraph)&(e.type == 9)) |
{ |
// Был ли график построен |
GC gc; |
|
|
if (e.type != 9) {gc = new |
GC(grpGr);} // Для полотна |
|
граической группы блокнота |
|
|
else {gc = (GC)e.gc;}; |
|
// Для области перерисовки |
//System.out.println(gc.toString());
Color black = display.getSystemColor(SWT.COLOR_BLACK); Color white = display.getSystemColor(SWT.COLOR_WHITE);
Color red |
= display.getSystemColor(SWT.COLOR_RED); |
gc.setBackground(white); |
|
gc.setForeground(black); |
|
gc.fillRectangle(grpGr.getBounds()); |
|
double minY = Yi[0]; |
double maxY = Yi[0]; |
|
|
for (int i = 1; i < |
colX; i++){ |
|
if (minY > Yi[i]) |
{minY = |
Yi[i];}; |
if (maxY < Yi[i]) |
{maxY = |
Yi[i];}; |
};
//System.out.println(getWidthString(gc, "Пример"));
int w = grpGr.getBounds().width - |
10; |
|
|
int h = grpGr.getBounds().height - |
15; |
|
|
double scaleX = w / ((maxX - minX) |
* 1.10); |
// Масштаб по |
|
Х |
|
|
|
double scaleY = h / ((maxY - minY) |
* 1.10); |
// Масштаб по |
|
Y |
|
|
|
int x0 = (int)Math.floor((0 - minX) * scaleX); |
// Положение |
||
оси Y |
|
|
|
int y0 = (int)Math.floor(h - (0 - minY) * scaleY);// Положение |
|||
оси Х |
|
|
|
gc.setLineWidth (penW); |
|
|
|
gc.drawText(nameGr.getText(), 150, |
30); |
// Имя графика |
|
gc.drawText(nameX.getText(), w-20, |
h-10); // Имя оси Х |
||
gc.drawText(nameY.getText(), 5, 15); |
// Имя оси Y |
||
double dx = (maxX - minX) / 5.0; |
// Шаг сетки по Х |
143
double dy = (maxY - |
minY) / 5.0; // Шаг сетки по Y |
|
for (int i = 0; i < |
6; i++){ // Рисуем шкалы и сетку |
|
double x = Math.floor(minX + dx*i); |
// Координата исходная |
|
int x1 = (int)Math.floor((x - minX) |
* scaleX); // |
Координата на экране
Formatter fmtx = (new Formatter()); gc.drawText(fmtx.format("%.2f", x).toString(), x1, h +
1); // Шкала по Х |
|
gc.drawLine(x1, 30, x1, h); |
// Сетка по Х |
double y = Math.floor(minY + dy*i); |
// Координата |
исходная |
|
int y1 = (int)Math.floor(h - (y - minY) * scaleY);// |
|
Координата на экране |
|
Formatter fmty = (new Formatter()); |
|
gc.drawText(fmty.format("%.2f", y).toString(), 3, y1-20); // |
|
Шкала по Y |
|
gc.drawLine(0, y1, w, y1); |
// Сетка по Y |
};
// Рисуем график
x0 = (int)Math.floor((Xi[0] - minX) * scaleX); // Задаем начальную точку
y0 = (int)Math.floor(h - (Yi[0] - minY) * scaleY);
gc.setLineWidth (penG); |
// Перо для графика |
||
gc.setForeground(red); |
// Цвет для графика |
||
for (int i = 1; i < colX; i++){ |
// По точкам графика |
||
int x1 |
= (int)Math.floor((Xi[i] - minX) * scaleX); |
||
int y1 |
= (int)Math.floor(h - (Yi[i] - minY) * scaleY); |
||
gc.drawLine(x0, y0, x1, y1); |
|
||
x0 = x1; y0 = y1; |
// Меняем начальную точку |
};
if (e.type == 13) {gc.dispose ();};
};
}
};
Метод с именем getWidthString возвращает ширину строки, выводимой на экран дисплея.
public static int getWidthString(final GC gc, final String key) {
// Получить ширину строку key на канве gc int w = 0;
int L = key.length();
for (int i = 0; i < L; ++i) {
w = w + gc.getCharWidth(key.charAt(i));
}; return w;
};
Главный метод приложения, вызываемый при его запуске public static void main(String[ ] args) {
144
// Главный метод приложения display = new Display(); shell = new Shell(display);
shell.setLayout(new FillLayout()); // Менеджер компоновки 102 shell.setText("Программирование на языке Java с использованием
SWT");
shell.addDisposeListener(new DisposeListener() {
// Обработчик для освобождения ресурсов при выходе из приложения public void widgetDisposed(DisposeEvent e) {
/* Free resources */ if (images != null) {
for (int i = 0; i < images.length; i++) { final Image image = images[i];
if (image != null) image.dispose();
}
images = null;
}
}
});
// Главное меню приложения
Menu bar = new Menu (shell, SWT.BAR); // Область меню shell.setMenuBar (bar);
// Группа меню "Файлы"
MenuItem fileItem = new MenuItem (bar, SWT.CASCADE); fileItem.setText ("Файлы");
Menu subFile = new Menu (shell, SWT.DROP_DOWN); fileItem.setMenu (subFile);
MenuItem itemOpen = new MenuItem (subFile, SWT.PUSH); itemOpen.setText ("Открыть");
itemOpen.addListener (SWT.Selection, onOpen);
MenuItem itemSave = new MenuItem (subFile, SWT.PUSH); itemSave.setText ("Сохранить");
itemSave.addListener (SWT.Selection, onSave); // Подключить
обработчик команды
MenuItem itemExit = new MenuItem (subFile, SWT.PUSH); itemExit.setText ("Выход");
itemExit.addListener (SWT.Selection, onExit); // Обработчик
MenuItem funItem = new MenuItem (bar, SWT.CASCADE); |
// |
Группа меню "Функции" |
|
funItem.setText ("Функции"); |
|
145
Menu subFun = new Menu (shell, SWT.DROP_DOWN); funItem.setMenu (subFun);
MenuItem itemRevise = new MenuItem (subFun, SWT.PUSH); itemRevise.setText ("Проверить задание"); itemRevise.addListener (SWT.Selection, onRevise); // Обработчик
MenuItem itemTable = new MenuItem (subFun, SWT.PUSH); itemTable.setText ("Построить график"); itemTable.addListener (SWT.Selection, onTable); // Обработчик
MenuItem itemGraph = new MenuItem (subFun, SWT.PUSH); itemGraph.setText ("Напечатать график"); itemGraph.addListener (SWT.Selection, onPrint); // Обработчик
MenuItem itemHelp = new MenuItem (bar, SWT.PUSH); itemHelp.setText ("Справка");
itemHelp.addListener (SWT.Selection, onHelp); // Обработчик
//Размеры окна приложения shell.setSize(700, 600);
//Блокнот с закладками
final TabFolder tabFolder = new TabFolder (shell, SWT.BORDER);
// Закладка "Исходные данные" |
|
|
TabItem tabInp = new TabItem (tabFolder, SWT.NONE); |
|
|
tabInp.setText ("Исходные данные"); |
// Название |
|
закладки |
|
|
Group grpInp = new Group(tabFolder, SWT.SHADOW_IN); |
// |
|
Создание полотна для элементов |
|
|
//Константы для размещения элементов ввода данных final int inp_leftLabel = 50;
final int inp_wLabel = 145; final int inp_leftText = 200; final int inp_wText = 200; final int inp_topLabel = 50; final int inp_hText = 20; final int inp_vertStep = 40;
//Все элементы размещаются на полотне группы, а группа на
закладке
//Поле ввода названия графика
Label lName = new Label(grpInp, SWT.LEFT); // Этикетка lName.setText("Название графика"); lName.setLocation(inp_leftLabel,inp_topLabel); lName.setSize(inp_wLabel,inp_hText);
nameGr = new Text(grpInp, SWT.BORDER | SWT.SINGLE); nameGr.setText("Полином произвольной степени");
146
nameGr.setLocation(inp_leftText,inp_topLabel); nameGr.setSize(inp_wText,inp_hText); nameGr.setToolTipText("Это поле для ввода имени графика");
//Для работы подсказок только на примере поля названия
графика !
nameGr.setData ("TIP_TEXT", getResourceString("nameGr.tooltip"));
nameGr.setData ("TIP_IMAGE", images[hhiInformation]); nameGr.setData ("TIP_HELPTEXTHANDLER", new
ToolTipHelpTextHandler(){
public String getHelpText(Widget widget) { return getResourceString("nameGr.help");
}
});
tooltip.activateHoverHelp(nameGr);
//Поле ввода названия оси Х
Label lX = new Label(grpInp, SWT.LEFT); lX.setText("Название оси X"); lX.setLocation(inp_leftLabel,inp_topLabel+1*inp_vertStep); lX.setSize(inp_wLabel,inp_hText);
nameX = new Text(grpInp, SWT.BORDER | SWT.SINGLE); nameX.setText("X"); nameX.setLocation(inp_leftText,inp_topLabel+1*inp_vertStep); nameX.setSize(inp_wText,inp_hText); nameX.setToolTipText("Это легенда для оси Х");
// Поле ввода названия оси Y
Label lY = new Label(grpInp, SWT.LEFT); lY.setText("Название оси Y"); lY.setLocation(inp_leftLabel,inp_topLabel+2*inp_vertStep); lY.setSize(inp_wLabel,inp_hText);
nameY = new Text(grpInp, SWT.BORDER | SWT.SINGLE); nameY.setText("P(x)"); nameY.setLocation(inp_leftText,inp_topLabel+2*inp_vertStep); nameY.setSize(inp_wText,inp_hText); nameY.setToolTipText("Это легенда для оси Y");
// Поле ввода минимального значения по оси Х Label lminX = new Label(grpInp, SWT.LEFT); lminX.setText("Минимальное значение X");
lminX.setLocation(inp_leftLabel,inp_topLabel+3*inp_vertStep); lminX.setSize(inp_wLabel,inp_hText);
minXText = new Text(grpInp, SWT.BORDER | SWT.SINGLE); minXText.setText("0.0"); minXText.setLocation(inp_leftText,inp_topLabel+3*inp_vertStep); minXText.setSize(inp_wText,inp_hText);
147
//Поле ввода максимального значения по оси Х
Label lmaxX = new Label(grpInp, SWT.LEFT); lmaxX.setText("Максимальное значение X"); lmaxX.setLocation(inp_leftLabel,inp_topLabel+4*inp_vertStep); lmaxX.setSize(inp_wLabel,inp_hText);
maxXText = new Text(grpInp, SWT.BORDER | SWT.SINGLE); maxXText.setText("10.0"); maxXText.setLocation(inp_leftText,inp_topLabel+4*inp_vertStep); maxXText.setSize(inp_wText,inp_hText);
//Поле ввода количества точек на оси X
Label lcolX = new Label(grpInp, SWT.LEFT); lcolX.setText("Количество точек на оси X"); lcolX.setLocation(inp_leftLabel,inp_topLabel+5*inp_vertStep); lcolX.setSize(inp_wLabel,inp_hText);
colXText = new Text(grpInp, SWT.BORDER | SWT.SINGLE); colXText.setText("11"); colXText.setLocation(inp_leftText,inp_topLabel+5*inp_vertStep); colXText.setSize(inp_wText,inp_hText);
// Поле ввода коэффициентов полинома в многострочном редакторе Label lkA = new Label(grpInp, SWT.LEFT);
lkA.setText("A[i], i = 0,1,2,3,..."); lkA.setLocation(inp_leftLabel,inp_topLabel+6*inp_vertStep); lkA.setSize(inp_wLabel,inp_hText);
errLabel = new Label(grpInp, SWT.LEFT); errLabel.setLocation(inp_leftLabel,inp_topLabel+7*inp_vertStep +
20); errLabel.setSize(inp_wLabel,inp_hText);
kAText = new Text(grpInp, SWT.BORDER | SWT.MULTI |
SWT.V_SCROLL);
kAText.setText("0.0\n1.5\n-0.05"); // По умолчанию kAText.setLocation(inp_leftText, inp_topLabel+6*inp_vertStep); kAText.setSize(inp_wText,10*inp_hText);
tabInp.setControl (grpInp); // Разместили группу grpInp на закладке
//============================== // Закладка для размещения таблицы
TabItem tabTab = new TabItem (tabFolder, SWT.NONE); tabTab.setText ("Таблица");
Group grpTbl = new Group(tabFolder, SWT.SHADOW_IN); // Группа
элементов
Label l2 = new Label(grpTbl, SWT.LEFT); // Элемент в группе l2.setText("Таблица значений функции");
148
l2.setLocation(5,15);
l2.setSize(145,20);
table = new Table (grpTbl, SWT.MULTI | SWT.BORDER |
SWT.FULL_SELECTION | SWT.V_SCROLL); table.setLinesVisible (true); table.setHeaderVisible (true);
columnX = new TableColumn (table, SWT.NONE); columnX.setText(nameX.getText()); // Заголовок столбца 1 columnX.setWidth(150);
columnY = new TableColumn (table, SWT.NONE); columnY.setText(nameY.getText()); // Заголовок столбца 2 columnY.setWidth(150);
table.setSize (table.computeSize (SWT.DEFAULT, 400)); table.setLocation(5, 40);
tabTab.setControl (grpTbl); // Разместили группу grpTbl на
закладке
//============================== // Закладка для размещения графика
TabItem tabGr = new TabItem (tabFolder, SWT.NONE); tabGr.setText ("График");
grpGr = new Group(tabFolder, SWT.SHADOW_IN);
//Label l3 = new Label(grpGr, SWT.LEFT);
//l3.setText("Название графика");
//l3.setLocation(50,50);
//l3.setSize(145,50);
tabGr.setControl (grpGr);
grpGr.addListener (SWT.Paint, onGraph); // Обработчик для перерисовки графика
//==============================
// Закладка для размещения страницы сообщений об ошибках
TabItem tabErr = new TabItem (tabFolder, SWT.NONE); tabErr.setText ("Неполадки");
Group grpErr = new Group(tabFolder, SWT.SHADOW_IN); Label lErr = new Label(grpErr, SWT.LEFT); // Этикетка lErr.setText("Сообщения об ошибках"); lErr.setLocation(5,15);
lErr.setSize(145,20);
errText = new Text(grpErr, SWT.BORDER | SWT.MULTI |
SWT.V_SCROLL); errText.setLocation(5,35); errText.setSize(550, 470);
149
tabErr.setControl (grpErr);
//Закончили формирование элементов формы и открываем ее shell.open();
//Цикл обработки сообщений из очереди операционной системы while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose (); |
// Освободили ресурсы ОС |
};
}
150