Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / ООП / Введение_SWG.pdf
Скачиваний:
82
Добавлен:
23.02.2015
Размер:
3.32 Mб
Скачать

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

Соседние файлы в папке ООП