- •Обозначения и сокращения
- •Введение
- •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 Пример приложения с элементами анимации
- •Список использованных источников
set(int calcMode, float[ ] keyValues, float[ ] keyTimes, float[ ] keySplines) .
Класс FloatArrayAnimationKeyFrame аналогичен предыдущему, но позволяет задавать траекторию массивами чисел, например:
float[ ] OHIO = {290.3f, 92.8f, 300.2f, 91.4f, 300.0f, ... }; float[ ] INDIANA = {269.2f, 132.9f, 270.1f, 129.6f, ... }; float[ ] KENTUCKY = {260.2f, 147.6f, 260.7f, 146.1f, ...};
float[ ][ ] KEY_VALUES = {OHIO, INDIANA, KENTUCKY};
new FloatArrayAnimationKeyFrame(polygon, “Points”, 5000, KEY_VALUES);
Класс IntegerAnimationKeyFrame аналогичен числовому заданию траектории, но оперирует с целыми значениями.
Класс ObjectAnimationKeyFrame анимирует различные атрибуты изображений посредством последовательности объектов, например:
String LINE_1 = "Little Jack Horner sat in the corner,” + ”\nEating a Christmas pie;";
String LINE_2 = "He put in his thumb,\nand pulled out a plum,"; String LINE_3 = "And said,\n\"What a good boy am I!\""; String[ ][ ] KEY_VALUES = {LINE_1, LINE_2, LINE_3};
new ObjectAnimationKeyFrame(polygon, “Text”, 5000, KEY_VALUES);
Класс PointAnimationKeyFrame |
анимирует атрибут Point как |
последовательность точек, например: |
|
Point[ ] POINTS = {new Point(17, 0), new Point(0, 23), ... };
new PointAnimationKeyFrame(ellipse, “Location”, 5000, POINTS);
10. 3 Поддержка времени
Параметр времени контролируется всеми видами анимации и является базовым понятием. Время измеряется по внутренним часам сцены. Простейшим заданием является продолжительность сцены, например:
setDuration(10000);
Следующим понятием является повторяемость сцены, задаваемой методами, например:
173
setRepeatIndefinitely(true);
setAutoReverse(false);
setRepeatCount(3);
10.4 Пример приложения с элементами анимации
Пусть необходимо продемонстрировать на дисплее траекторию движения самолета при посадке на полосу аэродрома. Исходными данными для программы являются названия графика, осей X, Y, начальная высота, скорость подлета, угол снижения, максимальное значение координаты X, масса самолета, тормозное усилие, шаг по времени. После контроля правильности ввода строится таблица узлов траектории снижения и посадки самолета и анимационная сцена посадки.
Интерфейсы взаимодействия с пользователем (рисунок 10.1) стандартные с использованием многостраничного блокнота. Пользователь может пользоваться основным и дополнительным меню для выполнения функций программы. Текст программы сопровождается подробными комментариями и приведен ниже.
1)package swtAnimation;
2)// Добавить -Djava.library.path=gtk.linux.x86 в окне VM arguments на закладке Run
3)import java.io.*;
4)import org.eclipse.swt.*;
5)import org.eclipse.swt.graphics.*;
6)import org.eclipse.swt.layout.*;
7)import org.eclipse.swt.program.*;
8)import org.eclipse.swt.widgets.*;
9)import org.eclipse.swt.animation.*;
10)import org.eclipse.swt.animation.framework.IAnimationKeyFrame;
11)public class Posadka {
12)static Display display; // Дисплей
13) |
static Shell shell; |
// Главное окно |
||||
14) |
static Text nameGr; |
// Имя графика |
||||
15) |
static |
Text |
nameX; |
// |
Имя оси |
Х |
16) |
static |
Text |
nameY; |
// |
Имя оси |
У |
17)static Text h0Text, vText, alfText;
18)static double h0, v0, alf;
19) |
static Text maxXText; |
// Максимальное Х |
20)static double maxX;
21) |
static Text mText; |
// Масса |
174
Рисунок 10.1 — Закладка для ввода исходных данных
22)static double m;
23) |
static Text ftText; |
// Тормозное усилие |
24)static double ft;
25) |
|
|
26) |
static Text dtText; |
// Шаг моделирования по |
времени |
|
|
27)static double dt;
28) |
static Text errText; |
// Для сообщений |
29)static boolean isError = false;
30)static boolean isVerify = false;
31)static boolean isTable = false;
175
32)static boolean isGraph = false;
33) |
static double[ ] Xi, Yi; |
// Массивы точек |
графика |
|
|
34)static Label errLabel;
35) |
static Table table; |
// Таблица значений графика |
36)static TableColumn colI; // Столбцы таблицы
37)static TableColumn colT, colX, colY, colV;
38)static int cntPnt=0;
39)static String fileName; // Имя файла для сохранения
40)static FileWriter fOut; // Файл для записи
41) |
static FileReader fIn; |
// Файл для чтения |
||
42) |
static |
Group grpGr; |
// |
Группа элементов для |
построения графика |
|
|
||
43) |
static |
int penW = 1; |
// |
Параметры пера для |
рисования |
|
|
|
|
44)static int penG = 2;
45)static int i;
46)static double xi, yi, vi, ti, minX1, maxX1, minY1,
maxY1;
47)static PointAnimationKeyFrame anim = null;
48)static Label img = null;
49) |
// ====== |
Обработчики меню |
========= |
50)static Listener onHelp = new Listener() {
51) |
public void handleEvent(Event e) { |
52) |
// Загрузить файл справки приложением по |
расширению html |
|
53) |
// |
Program.launch("C:\\eclipse\\about.html"); |
|
54) |
Program.launch("C:\\eclipse\\karjer.hlp"); |
55) |
} |
56)};
57)static Listener onPrint = new Listener() {
58) |
// Обработка команды меню "Печать графика" |
59) |
public void handleEvent(Event e) { |
60) |
|
61) |
} |
62)};
63)static Listener onExit = new Listener() {
64) |
// Обработка команды меню "Выход" |
65) |
public void handleEvent(Event e) { |
66) |
//gc.dispose(); // Уходим из приложения - |
освободили контекст |
|
67) |
shell.close(); // и закрыли окно |
68) |
} |
69)};
70)static Listener onOpen = new Listener() {
176
71) |
// Обработка команды меню "Открыть файл" |
72) |
public void handleEvent(Event e) { |
73) |
FileDialog dialog = new FileDialog(shell, |
SWT.OPEN); |
|
74) |
dialog.setFilterNames(new String[ ] |
75){ "Исходные данные","Все файлы (*.*)" });
76) |
dialog.setFilterExtensions(new String[ ] { |
"*.fun", "*.*" }); // Windows wild cards |
|
77) |
dialog.setFilterPath("c:\\user\\"); // |
Windows path |
|
78) |
dialog.setFileName("test.fun"); |
79) |
fileName = dialog.open(); |
80) |
try { |
81) |
fIn = new FileReader(fileName); |
82) |
BufferedReader br = new |
BufferedReader(fIn); |
|
83) |
nameGr.setText(br.readLine()); |
84) |
nameX.setText(br.readLine()); |
85) |
nameY.setText(br.readLine()); |
86) |
h0Text.setText(br.readLine()); |
87) |
vText.setText(br.readLine()); |
88) |
alfText.setText(br.readLine()); |
89) |
maxXText.setText(br.readLine()); |
90) |
mText.setText(br.readLine()); |
91) |
ftText.setText(br.readLine()); |
92) |
dtText.setText(br.readLine()); |
93) |
fIn.close(); |
94) |
} catch (IOException eio) { |
95) |
errText.append("Ошибка при чтении из |
файла " + fileName + "\n"); |
|
96) |
isError = true; |
97) |
} |
98) |
}; |
99)};
100)static Listener onSave = new Listener() {
101) |
// Обработка команды меню "Сохранить файл" |
102) |
public void handleEvent(Event e) { |
103) |
FileDialog dialog = new FileDialog(shell, |
SWT.SAVE); |
|
104) |
dialog.setFilterNames(new String[ ] |
105){ "Исходные данные","Все файлы (*.*)" });
106) |
dialog.setFilterExtensions(new String[ ] { |
"*.fun", "*.*" }); // Windows wild cards |
|
107) |
dialog.setFilterPath("c:\\user\\"); // |
Windows path |
|
108) |
dialog.setFileName("test.fun"); |
109) |
fileName = dialog.open(); |
110) |
try { |
177
111) |
fOut = new FileWriter(fileName); |
112) |
fOut.write(nameGr.getText() + "\n"); |
113) |
fOut.write(nameX.getText() + "\n"); |
114) |
fOut.write(nameY.getText() + "\n"); |
115) |
fOut.write(h0Text.getText() + "\n"); |
116) |
fOut.write(vText.getText() + "\n"); |
117) |
fOut.write(alfText.getText() + "\n"); |
118) |
fOut.write(maxXText.getText() + |
"\n"); |
|
119) |
fOut.write(mText.getText() + "\n"); |
120) |
fOut.write(ftText.getText() + "\n"); |
121) |
fOut.write(dtText.getText() + "\n"); |
122) |
fOut.close(); |
123) |
} catch (IOException eio) { |
124) |
errText.append("Ошибка при записи в |
файл " + fileName + "\n"); |
|
125) |
isError = true; |
126) |
} |
127) |
} |
128)};
129)static Listener onRevise = new Listener() {
130) |
// Обработка команды меню "Проверить данные" |
131) |
public void handleEvent(Event e) { |
132) |
errText.setText(""); |
133) |
isError = false; |
134) |
try { |
135) |
h0 = |
Double.parseDouble(h0Text.getText()); |
|
136) |
} catch (RuntimeException e1) { |
137) |
// System.out.println("Ошибка в |
задании H0"); |
|
138) |
errText.append("Ошибка в задании |
H0 \n"); |
|
139) |
isError = true; |
140) |
}; |
141) |
try { |
142) |
v0 = |
Double.parseDouble(vText.getText()) * 1000.0 / 3600.0; |
|
143) |
} catch (RuntimeException e1) { |
144) |
// System.out.println("Ошибка в |
задании v"); |
|
145) |
errText.append("Ошибка в задании |
скорости \n"); |
|
146) |
isError = true; |
147) |
}; |
148) |
try { |
149) |
alf = |
Double.parseDouble(alfText.getText()) * 3.14 / 180.0;
178
150) |
if ((alf < 0.0) | (alf > 0.7)) { |
151) |
errText.append("Ошибка в задании |
угла снижения - недопустимый\n"); |
|
152) |
isError = true; |
153) |
}; |
154) |
} catch (RuntimeException e1) { |
155) |
// System.out.println("Ошибка в |
задании alf"); |
|
156) |
errText.append("Ошибка в задании угла |
снижения \n"); |
|
157) |
isError = true; |
158) |
}; |
159) |
try { |
160) |
maxX = |
Double.parseDouble(maxXText.getText()) * 1000.0; |
|
161) |
} catch (RuntimeException e1) { |
162) |
// System.out.println("Ошибка в |
задании maxX"); |
|
163) |
errText.append("Ошибка в задании |
максимального X \n"); |
|
164) |
isError = true; |
165) |
}; |
166) |
try { |
167) |
m = |
Double.parseDouble(mText.getText()) * 1000.0; |
|
168) |
} catch (RuntimeException e1) { |
169) |
// System.out.println("Ошибка в |
задании массы"); |
|
170) |
errText.append("Ошибка в задании |
массы \n"); |
|
171) |
isError = true; |
172) |
}; |
173) |
try { |
174) |
ft = |
Double.parseDouble(ftText.getText()) * 1000.0; |
|
175) |
} catch (RuntimeException e1) { |
176) |
// System.out.println("Ошибка в |
задании тормозного усилия"); |
|
177) |
errText.append("Ошибка в задании |
тормозного усилия \n"); |
|
178) |
isError = true; |
179) |
}; |
180) |
try { |
181) |
dt = |
Double.parseDouble(dtText.getText()); |
|
182) |
} catch (RuntimeException e1) { |
183) |
// System.out.println("Ошибка в |
задании maxX"); |
|
184) |
errText.append("Ошибка в задании шага |
179
по времени \n"); |
|
|
185) |
|
isError = true; |
186) |
|
}; |
187) |
|
if (!isError) { |
188) |
errLabel.setForeground(display.getSystemColor(SWT.COLOR_B |
|
LUE)); |
|
|
189) |
|
errLabel.setText("Все верно!"); |
190) |
|
isVerify = true; |
191) |
|
} else { |
errLabel.setForeground(display.getSystemColor(SWT.COLOR_RED)) |
||
; |
|
|
192) |
|
errLabel.setText("Есть ошибки!"); |
193) |
|
isVerify = false; |
194) |
|
}; |
195) |
|
isTable = false; |
196) |
|
isGraph = false; |
197) |
} |
|
198) |
}; |
// Конец проверки |
199)static Listener onTable = new Listener() {
200) |
// Обработка команды меню "Построить таблицу" |
201) |
public void handleEvent(Event e) { |
202) |
// Удалить старые строки |
203) |
table.removeAll(); |
204) |
isTable = false; |
205) |
cntPnt=0; |
206) |
// Расчет и формирование строк таблицы |
значений функции |
|
207) |
if (!isVerify) { |
208) |
MessageBox msg = new |
MessageBox(shell, SWT.ICON_QUESTION | SWT.OK); |
|
209) |
msg.setMessage("Необходимо проверить |
исходные данные!"); |
|
210) |
msg.open(); |
211) |
return; |
212) |
}; |
213) |
ti = 0.0; |
214) |
xi = 0; |
215) |
yi = h0; |
216) |
vi = v0; |
217) |
minX1 = 0.0; |
218) |
maxX1 = 0.0; |
219) |
minY1 = 0.0; |
220) |
maxY1 = 0.0; |
221) |
TableItem item = new TableItem(table, |
SWT.NONE); |
|
222) |
item.setText(0, String.format("%d", i)); |
223) |
item.setText(1, String.format("%6.2f", |
180
ti)); |
|
|
224) |
|
item.setText(2, String.format("%6.2f", |
xi)); |
|
|
225) |
|
item.setText(3, String.format("%6.2f", |
yi)); |
|
|
226) |
|
item.setText(4, String.format("%6.2f", |
vi)); |
|
|
227) |
|
while ((xi <= maxX) & (vi > 0.0)) { |
228) |
|
cntPnt = cntPnt + 1; |
229) |
|
ti = ti + dt; |
230) |
|
if (yi > 0.0) { |
231) |
|
xi = xi + dt * vi * |
Math.cos(alf); |
|
|
232) |
|
yi = yi - dt * vi * |
Math.sin(alf); |
|
|
233) |
|
if (yi < 0.0) { |
234) |
|
yi = 0.0; |
235) |
|
}; |
236) |
|
} else { |
237) |
|
yi = 0.0; |
238) |
|
vi = vi - ft * dt / m; |
239) |
|
if (vi < 0.0) { |
240) |
|
vi = 0.0; |
241) |
|
}; |
242) |
|
xi = xi + vi * dt; |
243) |
|
}; |
244) |
|
item = new TableItem(table, |
SWT.NONE); |
|
|
245) |
|
item.setText(0, String.format("%d", |
(int) cntPnt)); |
||
246) |
|
item.setText(1, |
String.format("%6.2f", ti)); |
||
247) |
|
item.setText(2, |
String.format("%6.2f", xi)); |
||
248) |
|
item.setText(3, |
String.format("%6.2f", yi)); |
||
249) |
|
item.setText(4, |
String.format("%6.2f", vi)); |
||
250) |
|
if (maxX1 < xi) { |
251) |
|
maxX1 = xi; |
252) |
|
}; |
253) |
|
if (maxY1 < yi) { |
254) |
|
maxY1 = yi; |
255) |
|
}; |
256) |
|
}; |
257) |
|
isTable = true; |
258) |
|
} |
259) |
}; |
// Конец таблицы |
181
260)static Listener onGraph = new Listener() {
261) |
// Обработка запроса на перерисовку графика |
262) |
public void handleEvent(Event e) { |
263) |
// Чтение изображения из файла samolet.bmp, |
подготовленного |
|
264) |
// стандартным Imaging |
265) |
// ImageLoader imgLd = new |
ImageLoader(); // Загрузчик |
|
266) |
// ImageData planerImg = |
imgLd.load("samolet.bmp")[0]; // Чтение |
|
267) |
// данных |
268) |
// final Image planer = new Image |
(display, planerImg); // Создание |
|
269) |
// картинки |
270) |
// Интегрированный оператор создания и |
чтения изображения из файла |
|
271) |
final Image planer = new Image(display, |
((new ImageLoader()) |
|
272) |
.load("samolet1.bmp")[0])); |
273) |
final Image planerd = new Image(display, |
((new ImageLoader()) |
|
274) |
.load("samoletd.bmp")[0])); |
275) |
Color green = |
display.getSystemColor(SWT.COLOR_GREEN); |
|
276) |
// Ручное создание картинки самолета |
(грубая) |
|
277) |
// final Image planer = new Image |
(display, 30, 15); |
|
278) |
// planer.setBackground(black); |
279) |
// GC gcImg = new GC(planer); |
280) |
// gcImg.setBackground (black); |
281) |
// gcImg.fillRectangle(0,0,30,15); // |
Черный фон рисунка |
|
282) |
// gcImg.setBackground (red); // Инверсный |
цвет самолета |
|
283) |
// gcImg.fillRectangle(0,7,30,6); // |
Фюзеляж |
|
284) |
// gcImg.fillRectangle(20,0,4,16); // |
Крылья |
|
285) |
// gcImg.fillRectangle(0,1,3,6); // Хвост |
286) |
// gcImg.dispose(); |
287) |
if (isTable) { |
288) |
int w = grpGr.getBounds().width - 15; |
|
// Размер графика по ширине |
289) |
int h = grpGr.getBounds().height - |
15; |
// Размер графика по высоте |
290) |
double scaleX = w / ((maxX1) * 1.10); |
|
// Масштаб по Х |
291) |
// double scaleY = h / ((maxY1) * |
182
1.10); |
// Масштаб по Y |
|
|
292) |
|
int x0 = 10; |
|
|
// Положение оси Y |
||
293) |
|
int y0 = h - 15; |
|
|
// Положение оси Х |
||
294) |
|
grpGr.setForegroundRGB(new |
|
RGB(255,255,255)); |
|
|
|
295) |
|
grpGr.setBackgroundRGB(new |
|
RGB(255,255,255)); |
|
|
|
296) |
|
grpGr.redraw(); |
|
297) |
|
// Вариант закраски голубого неба |
|
298) |
|
//float[ ] polyPnt = {12,10, w-10,10, |
|
w-10,h-35, 12,h-35}; |
|
||
299) |
|
//Polygon sky = new Polygon(grpGr, |
|
SWT.LIGHTWEIGHT); |
|
|
|
300) |
|
//sky.setPoints(polyPnt); |
|
301) |
|
//sky.setBackgroundRGB(new |
|
RGB(230,230,230)); |
|
|
|
302) |
|
//sky.setForegroundRGB(new |
|
RGB(230,230,230)); |
|
|
|
303) |
|
//Название графика |
|
304) |
|
Label txt = new Label(grpGr, |
|
SWT.NONE); |
|
|
|
305) |
|
txt.setLocation(250, 30); |
|
306) |
|
txt.setText(nameGr.getText()); |
|
307) |
|
txt.setSize(300, 30); |
|
308) |
|
txt.setForegroundRGB(new |
|
RGB(155,0,155)); |
|
|
|
309) |
|
// |
Название оси ХX |
310) |
|
txt = new Label(grpGr, SWT.NONE); |
|
311) |
|
txt.setLocation(w-5, h); |
|
312) |
|
txt.setText(nameX.getText()); |
|
313) |
|
txt.setSize(200, 30); |
|
314) |
|
// |
Название оси Y |
315) |
|
txt = new Label(grpGr, SWT.NONE); |
|
316) |
|
txt.setLocation(15, 20); |
|
317) |
|
txt.setText(nameY.getText()); |
|
318) |
|
txt.setSize(200, 30); |
|
319) |
|
// Оси |
|
320) |
|
Line lineX = new Line(grpGr, |
|
SWT.NONE); |
// X |
|
|
321) |
|
lineX.setPoints(x0, y0, w, y0); |
|
322) |
|
Line lineY = new Line(grpGr, |
|
SWT.NONE); |
// Y |
|
|
323) |
|
lineY.setPoints(x0, 10, x0, y0); |
|
324) |
|
Line lineG = new Line(grpGr, |
|
SWT.NONE); |
// Трава слева |
||
325) |
|
lineG.setPoints(x0, y0, (int) |
(Math.floor(h0 / Math.tan(alf) * scaleX)), y0);
183
326) |
lineG.setForeground(green); |
327) |
lineG.setLineWidth(15); |
328) |
lineG = new Line(grpGr, SWT.NONE); |
// Трава справа |
|
329) |
lineG.setPoints((int) |
(Math.floor(maxX * scaleX)) + 30, y0, w, y0); |
|
330) |
lineG.setForeground(green); |
331) |
lineG.setLineWidth(15); |
332) |
// Начальные установки параметров |
полета |
|
333) |
i = 0; |
334) |
ti = 0.0; |
335) |
xi = 0; |
336) |
yi = h0; |
337) |
vi = v0; |
338) |
int x1 = 0, y1 = 0; |
339) |
int numP = 0; |
340) |
Point[ ] points = new Point[cntPnt]; |
|
// Массив точек глиссады |
341) |
while ((xi <= maxX) & (vi > 0.0) & |
(numP < cntPnt)) { |
// Цикл моделирования одного |
// шага по времени |
|
342) |
ti = ti + dt; // Время модели |
343) |
if (yi > 0.0) {// Еще в полете |
344) |
xi = xi + dt * vi * |
Math.cos(alf); |
|
345) |
yi = yi - dt * vi * |
Math.sin(alf); |
// Снижаемся под углом alf |
346) |
if (yi < 0.0) { |
347) |
yi = 0.0; |
348) |
}; |
349) |
} else { // Катимся по полосе |
350) |
vi = vi - ft * dt / m; |
|
// Торможение с усилием ft |
351) |
if (vi < 0.0) { |
352) |
vi = 0.0; |
353) |
}; // Остановились |
354) |
xi = xi + vi * dt; |
|
// Новое положение по |
горизонтали |
|
355) |
}; |
356) |
x1 = (int) Math.floor(xi * |
scaleX) + 10; |
// Координаты ЛВУ на экране в точках |
растра |
|
357) |
y1 = (int) Math.floor(h - yi * |
scaleX) - 30; |
// Тот же масштаб что и по Х |
184
358) |
|
points[numP] = new Point(x1,y1); |
|
359) |
|
//errText.append(""+points[numP] |
|
.x+" : "+points[numP].y+"\n"); |
|
||
360) |
|
numP=numP+1; |
|
361) |
|
}; |
|
362) |
|
// Линия глиссады желтым цветом |
|
363) |
|
Polyline line = new Polyline(grpGr, |
|
SWT.LIGHTWEIGHT); |
|
||
364) |
|
line.setPoints(points); |
|
365) |
|
line.setForegroundRGB(new |
|
RGB(255,250,100)); |
|
||
366) |
|
if (!(anim == null)) { |
// Если |
ранее была запущена анимация |
|
||
367) |
|
img.dispose(); |
// то |
удалить старую картинку самолета |
|
||
368) |
|
} |
|
369) |
|
// Изображение самолета как рисунок |
|
на этикетке |
|
|
|
370) |
|
img = new Label(grpGr,SWT.NONE); |
|
371) |
|
img.setSize(30, 15); |
|
372) |
|
img.setImage(planer); |
|
373) |
|
img.setLocation(points[0]); |
|
374) |
|
//grpGr.pack(); |
|
375) |
|
// Подготовка задания для анимации |
|
376) |
|
long now = |
|
shell.getDisplay().getSceneClock().getTime() + 10; |
// |
||
Время старта |
|
|
|
377) |
|
anim = new |
|
PointAnimationKeyFrame(img, // Объект анимации |
|
||
378) |
|
"Location", now, 20000, |
|
points); |
|
|
|
379) |
|
anim.setRepeatIndefinitely(false); |
|
|
|
// Без повторений |
|
380) |
|
|
|
|
anim.setCalcMode(IAnimationKeyFrame.CALC_MODE_LINEAR); |
||
|
// Режим интерполяции |
|
|
381) |
|
//anim.setCalcMode(IAnimationKeyFrame |
|
.CALC_MODE_DISCRETE); |
|
||
382) |
|
//anim.setCalcMode(IAnimationKeyFrame |
|
.CALC_MODE_PACED); |
|
||
383) |
|
//anim.start(); |
|
384) |
|
if (vi > 0.0) { |
|
385) |
|
//img.setImage(planerd); |
|
386) |
|
} else { |
|
387) |
|
//img.setImage(planer); |
|
388) |
|
} |
|
389) |
|
} |
|
390) |
|
} |
|
391) |
}; |
// Конец графика |
|
185
392)
393)public static void main(String[ ] args) {
394) |
// Главный метод приложения |
395) |
display = new Display(); |
396) |
shell = new Shell(display); |
397) |
shell.setLayout(new FillLayout()); |
398) |
shell.setText("Моделирование посадки самолета с |
использованием библиотеки SWG"); |
|
399) |
// Размеры окна приложения |
400) |
shell.setSize(700, 600); |
401) |
// Главное меню приложения |
402) |
Menu bar = new Menu(shell, SWT.BAR); // Область |
Главного меню |
|
403) |
shell.setMenuBar(bar); |
404) |
MenuItem fileItem = new MenuItem(bar, |
SWT.CASCADE); |
|
405) |
fileItem.setText("Файлы"); // Группа файлов |
406) |
Menu subFile = new Menu(shell, SWT.DROP_DOWN); |
407) |
fileItem.setMenu(subFile); |
408) |
MenuItem itemOpen = new MenuItem(subFile, |
SWT.PUSH); |
|
409) |
itemOpen.setText("Открыть"); |
410) |
itemOpen.addListener(SWT.Selection, onOpen); |
411) |
MenuItem itemSave = new MenuItem(subFile, |
SWT.PUSH); |
|
412) |
itemSave.setText("Сохранить"); |
413) |
itemSave.addListener(SWT.Selection, onSave); |
414) |
MenuItem itemExit = new MenuItem(subFile, |
SWT.PUSH); |
|
415) |
itemExit.setText("Выход"); |
416) |
itemExit.addListener(SWT.Selection, onExit); |
417) |
MenuItem funItem = new MenuItem(bar, |
SWT.CASCADE); |
|
418) |
funItem.setText("Функции"); // Группа функций |
419) |
Menu subFun = new Menu(shell, SWT.DROP_DOWN); |
420) |
funItem.setMenu(subFun); |
421) |
MenuItem itemRevise = new MenuItem(subFun, |
SWT.PUSH); |
|
422) |
itemRevise.setText("Проверить задание"); |
423) |
itemRevise.addListener(SWT.Selection, |
onRevise); |
|
424) |
MenuItem itemTable = new MenuItem(subFun, |
SWT.PUSH); |
|
425) |
itemTable.setText("Построить таблицу"); |
186
426) |
itemTable.addListener(SWT.Selection, onTable); |
427) |
MenuItem itemGraph = new MenuItem(subFun, |
SWT.PUSH); |
|
428) |
itemGraph.setText("Построить график"); |
429) |
itemGraph.addListener(SWT.Selection, onGraph); |
430) |
MenuItem itemHelp = new MenuItem(bar, |
SWT.PUSH); |
|
431) |
itemHelp.setText("Справка"); |
432) |
itemHelp.addListener(SWT.Selection, onHelp); |
433) |
// Создание падающего меню (правая кнопка |
мышки) |
|
434) |
Menu popMenu = new Menu(shell, SWT.POP_UP); // |
Меню |
|
435) |
MenuItem popItemRevise = new MenuItem(popMenu, |
SWT.PUSH); // Позиция меню |
|
436) |
popItemRevise.setText("Проверить задание"); |
437) |
popItemRevise.addListener(SWT.Selection, |
onRevise); // Обработчик |
|
438) |
MenuItem popItemTable = new MenuItem(popMenu, |
SWT.PUSH); // Позиция меню |
|
439) |
popItemTable.setText("Построить таблицу"); |
440) |
popItemTable.addListener(SWT.Selection, |
onTable); // Обработчик |
|
441) |
MenuItem popItemGraph = new MenuItem(popMenu, |
SWT.PUSH); // Позиция меню |
|
442) |
popItemGraph.setText("Построить график"); |
443) |
popItemGraph.addListener(SWT.Selection, |
onGraph); // Обработчик |
|
444) |
// Блокнот с закладками |
445) |
final TabFolder tabFolder = new |
TabFolder(shell, SWT.BORDER); |
|
446) |
// Закладка "Исходные данные" |
447) |
TabItem tabInp = new TabItem(tabFolder, |
SWT.NONE); |
|
448) |
tabInp.setText("Исходные данные"); |
449) |
// Создали группу для элементов на закладке |
450) |
Group grpInp = new Group(tabFolder, |
SWT.SHADOW_IN); |
|
451) |
// Константы для размещения элементов ввода |
исходных данных |
|
452) |
final int inp_leftLabel = 50; |
453) |
final int inp_wLabel = 245; |
454) |
final int inp_leftText = 300; |
187
455) |
final int inp_wText = 300; |
456) |
final int inp_topLabel = 50; |
457) |
final int inp_hText = 20; |
458) |
final int inp_vertStep = 40; |
459) |
// Поле ввода названия графика |
460) |
Label lName = new Label(grpInp, SWT.LEFT); |
461) |
lName.setText("Название графика"); |
462) |
lName.setLocation(inp_leftLabel, inp_topLabel); |
463) |
lName.setSize(inp_wLabel, inp_hText); |
464) |
nameGr = new Text(grpInp, SWT.BORDER | |
SWT.SINGLE); |
|
465) |
nameGr.setText("Посадка самолета на полосу"); |
466) |
nameGr.setLocation(inp_leftText, inp_topLabel); |
467) |
nameGr.setSize(inp_wText, inp_hText); |
468) |
// Поле ввода названия оси Х |
469) |
Label lX = new Label(grpInp, SWT.LEFT); |
470) |
lX.setText("Название оси X"); |
471) |
lX.setLocation(inp_leftLabel, inp_topLabel + 1 |
* inp_vertStep); |
|
472) |
lX.setSize(inp_wLabel, inp_hText); |
473) |
nameX = new Text(grpInp, SWT.BORDER | |
SWT.SINGLE); |
|
474) |
nameX.setText("X"); |
475) |
nameX.setLocation(inp_leftText, inp_topLabel + |
1 * inp_vertStep); |
|
476) |
nameX.setSize(inp_wText, inp_hText); |
477) |
// Поле ввода названия оси Y |
478) |
Label lY = new Label(grpInp, SWT.LEFT); |
479) |
lY.setText("Название оси Y"); |
480) |
lY.setLocation(inp_leftLabel, inp_topLabel + 2 |
* inp_vertStep); |
|
481) |
lY.setSize(inp_wLabel, inp_hText); |
482) |
nameY = new Text(grpInp, SWT.BORDER | |
SWT.SINGLE); |
|
483) |
nameY.setText("H(x)"); |
484) |
nameY.setLocation(inp_leftText, inp_topLabel + |
2 * inp_vertStep); |
|
485) |
nameY.setSize(inp_wText, inp_hText); |
486) |
// Поле ввода начальной высоты h0 |
487) |
Label lh0 = new Label(grpInp, SWT.LEFT); |
488) |
lh0.setText("Начальная высота (м)"); |
489) |
lh0.setLocation(inp_leftLabel, inp_topLabel + 3 |
* inp_vertStep); |
|
490) |
lh0.setSize(inp_wLabel, inp_hText); |
491) |
h0Text = new Text(grpInp, SWT.BORDER | |
SWT.SINGLE); |
|
492) |
h0Text.setText("50.0"); |
493) |
h0Text.setLocation(inp_leftText, inp_topLabel + |
188
3 * inp_vertStep);
494) |
h0Text.setSize(inp_wText, inp_hText); |
495) |
// Поле ввода скорости подлета |
496) |
Label lv = new Label(grpInp, SWT.LEFT); |
497) |
lv.setText("Скорость подлета (км/час)"); |
498) |
lv.setLocation(inp_leftLabel, inp_topLabel + 4 |
* inp_vertStep); |
|
499) |
lv.setSize(inp_wLabel, inp_hText); |
500) |
vText = new Text(grpInp, SWT.BORDER | |
SWT.SINGLE); |
|
501) |
vText.setText("200.0"); |
502) |
vText.setLocation(inp_leftText, inp_topLabel + |
4 * inp_vertStep); |
|
503) |
vText.setSize(inp_wText, inp_hText); |
504) |
// Поле ввода угла снижения |
505) |
Label lalf = new Label(grpInp, SWT.LEFT); |
506) |
lalf.setText("Угол снижения (градусы)"); |
507) |
lalf.setLocation(inp_leftLabel, inp_topLabel + |
5 * inp_vertStep); |
|
508) |
lalf.setSize(inp_wLabel, inp_hText); |
509) |
alfText = new Text(grpInp, SWT.BORDER | |
SWT.SINGLE); |
|
510) |
alfText.setText("10.0"); |
511) |
alfText.setLocation(inp_leftText, inp_topLabel |
+ 5 * inp_vertStep); |
|
512) |
alfText.setSize(inp_wText, inp_hText); |
513) |
// Поле ввода максимального значения по оси Х |
514) |
Label lmaxX = new Label(grpInp, SWT.LEFT); |
515) |
lmaxX.setText("Макс. значение X (км)"); |
516) |
lmaxX.setLocation(inp_leftLabel, inp_topLabel + |
6 * inp_vertStep); |
|
517) |
lmaxX.setSize(inp_wLabel, inp_hText); |
518) |
maxXText = new Text(grpInp, SWT.BORDER | |
SWT.SINGLE); |
|
519) |
maxXText.setText("10.0"); |
520) |
maxXText.setLocation(inp_leftText, inp_topLabel |
+ 6 * inp_vertStep); |
|
521) |
maxXText.setSize(inp_wText, inp_hText); |
522) |
// Поле ввода массы самолета |
523) |
Label lm = new Label(grpInp, SWT.LEFT); |
524) |
lm.setText("Масса самолета (тонн)"); |
525) |
lm.setLocation(inp_leftLabel, inp_topLabel + 7 |
* inp_vertStep); |
|
526) |
lm.setSize(inp_wLabel, inp_hText); |
527) |
mText = new Text(grpInp, SWT.BORDER | |
189
SWT.SINGLE); |
|
528) |
mText.setText("15.0"); |
529) |
mText.setLocation(inp_leftText, inp_topLabel + |
7 * inp_vertStep); |
|
530) |
mText.setSize(inp_wText, inp_hText); |
531) |
// Поле ввода тормозного усилия |
532) |
Label lft = new Label(grpInp, SWT.LEFT); |
533) |
lft.setText("Тормозное усилие (тонн)"); |
534) |
lft.setLocation(inp_leftLabel, inp_topLabel + 8 |
* inp_vertStep); |
|
535) |
lft.setSize(inp_wLabel, inp_hText); |
536) |
ftText = new Text(grpInp, SWT.BORDER | |
SWT.SINGLE); |
|
537) |
ftText.setText("100.0"); |
538) |
ftText.setLocation(inp_leftText, inp_topLabel + |
8 * inp_vertStep); |
|
539) |
ftText.setSize(inp_wText, inp_hText); |
540) |
// Поле ввода количества точек на оси X |
541) |
Label ldt = new Label(grpInp, SWT.LEFT); |
542) |
ldt.setText("Шаг по времени (сек)"); |
543) |
ldt.setLocation(inp_leftLabel, inp_topLabel + 9 |
* inp_vertStep); |
|
544) |
ldt.setSize(inp_wLabel, inp_hText); |
545) |
dtText = new Text(grpInp, SWT.BORDER | |
SWT.SINGLE); |
|
546) |
dtText.setText("0.2"); |
547) |
dtText.setLocation(inp_leftText, inp_topLabel + |
9 * inp_vertStep); |
|
548) |
dtText.setSize(inp_wText, inp_hText); |
549) |
errLabel = new Label(grpInp, SWT.LEFT); |
550) |
errLabel.setLocation(inp_leftLabel, |
inp_topLabel + 10 * inp_vertStep + 20); |
|
551) |
errLabel.setSize(inp_wLabel, inp_hText); |
552) |
// Разместили группу на закладке |
553) |
tabInp.setControl(grpInp); |
554) |
// ====== Закладка для таблицы ========= |
555) |
TabItem tabTab = new TabItem(tabFolder, |
SWT.NONE); |
|
556) |
tabTab.setText("Таблица"); |
557) |
Group grpTbl = new Group(tabFolder, |
SWT.SHADOW_IN); |
|
558) |
Label l2 = new Label(grpTbl, SWT.LEFT); |
559) |
l2.setText("Таблица значений параметров |
процесса"); |
|
560) |
l2.setLocation(5, 15); |
190
561) |
l2.setSize(145, 20); |
|
562) |
table = new Table(grpTbl, SWT.MULTI | |
|
SWT.BORDER | SWT.FULL_SELECTION |
| SWT.V_SCROLL); |
|
563) |
table.setLinesVisible(true); |
|
564) |
table.setHeaderVisible(true); |
|
565) |
colI = new TableColumn(table, SWT.NONE); |
|
566) |
colI.setText("Шаг"); // Заголовок столбца 1 |
|
567) |
colI.setWidth(50); |
|
568) |
colT = new TableColumn(table, SWT.NONE); |
|
569) |
colT.setText("Время (сек)"); // Заголовок |
|
столбца 2 |
|
|
570) |
colT.setWidth(100); |
|
571) |
colX = new TableColumn(table, SWT.NONE); |
|
572) |
colX.setText("Расстояние (м)"); // Заголовок |
|
столбца 3 |
|
|
573) |
colX.setWidth(100); |
|
574) |
colY = new TableColumn(table, SWT.NONE); |
|
575) |
colY.setText("Высота (м)"); // Заголовок |
|
столбца 4 |
|
|
576) |
colY.setWidth(100); |
|
577) |
colV = new TableColumn(table, SWT.NONE); |
|
578) |
colV.setText("Скорость (м/сек)"); // Заголовок |
|
столбца 5 |
|
|
579) |
colV.setWidth(100); |
|
580) |
table.setSize(table.computeSize(SWT.DEFAULT, |
|
400)); |
|
|
581) |
table.setLocation(5, 40); |
|
582) |
tabTab.setControl(grpTbl); |
|
583) |
// ====== Закладка для графика ======= |
|
584) |
TabItem tabGr = new TabItem(tabFolder, |
|
SWT.NONE); |
|
|
585) |
tabGr.setText("График"); |
|
586) |
grpGr = new Group(tabFolder, SWT.LIGHTWEIGHT); |
|
587) |
grpGr.setBackgroundRGB(new RGB(230,230,255)); |
|
588) |
grpGr.setForegroundRGB(new RGB(230,230,255)); |
|
589) |
//gc = new GC(grpGr); // Создали контекст на |
|
все время работы приложения до завершения |
||
590) |
//img = new Label(grpGr,SWT.NONE); |
|
591) |
tabGr.setControl(grpGr); |
|
592) |
// grpGr.addListener (SWT.Paint, onGraph); // |
|
Установили обработчик для |
|
|
593) |
// перерисовки графика |
|
594) |
// ====== Закладка для отчетов ========= |
191
595) |
TabItem tabErr = new TabItem(tabFolder, |
SWT.NONE); |
|
596) |
tabErr.setText("Неполадки"); |
597) |
Group grpErr = new Group(tabFolder, |
SWT.SHADOW_IN); |
|
598) |
Label lErr = new Label(grpErr, SWT.LEFT); |
599) |
lErr.setText("Сообщения об ошибках"); |
600) |
lErr.setLocation(5, 15); |
601) |
lErr.setSize(145, 20); |
602) |
errText = new Text(grpErr, SWT.BORDER | |
SWT.MULTI | SWT.V_SCROLL); |
|
603) |
errText.setLocation(5, 35); |
604) |
errText.setSize(550, 470); |
605) |
tabErr.setControl(grpErr); |
606) |
// Подключение падающего меню (правая кнопка |
мышки) |
|
607) |
shell.setMenu(popMenu); |
608) |
grpInp.setMenu(popMenu); |
609) |
grpTbl.setMenu(popMenu); |
610) |
grpGr.setMenu(popMenu); |
611) |
// Закончили формирование элементов формы и |
открываем ее |
|
612) |
shell.open(); |
613) |
// Цикл обработки сообщений из очереди |
операционной системы |
|
614) |
while (!shell.isDisposed()) { |
615) |
if (!display.readAndDispatch()) |
616) |
display.sleep(); |
617) |
} |
618) |
display.dispose(); |
619) |
} |
620) |
} |
192