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

1 Простое SWT приложение

1.1 Создание приложения

Создадим новый проект Java. Для этого выберем в меню позиции Файл- >Новый->Проект. Выберем «Проект Java» в дереве мастеров. В следующей закладке мастера проекта введем имя проекта «SWTHello». В закладке «Библиотеки» страницы «Параметры Java» мастера создания проекта добавим требуемую библиотеку (эту операцию можно сделать и позже, редактируя свойства проекта – кликнуть правой кнопкой мыши по имени проекта). Нажмем кнопку «Добавить библиотеку» и выберем «Standard Widget Toolkit (SWT)» Если данной библиотеки не окажется в списке библиотек вашей версии Eclipse, то архив org.eclipse.swt.win32.win32.x86_3.1.1.jar можно будет добавить, нажав кнопку «Добавить внешние Jar» (рисунок 1.1).

Рисунок 1.1 – Задание свойств проекта

14

Создадим пакет «SWTHello» и добавим в него новый класс «HelloSwt». Включить переключатели «public static void main» и добавить следующий код: package SWTHello;

import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell;

public class HelloSWT {

public static void main(String[ ] args) {

//Создаем объект Display для связи SWT //с дисплеем операционной системы

Display display = new Display();

//Создаем окно программы

Shell shell = new Shell(display); shell.setText("SWT Hello"); shell.setSize(200, 100); shell.open();

//Обработка закрытия окна while (!shell.isDisposed()) {

if (!display.readAndDispatch()) { display.sleep();

}

}

//Ресурсы операционной системы //должны быть освобождены display.dispose();

}

}

Запускаем проект как SWTили Java-приложение. В результате получим окно, показанное на рисунке 1.2.

Рисунок 1.2 – Простое приложение

Следующая проблема возникает как при работе под управлением ОС Windows, так и ОС Linux. Если при запуске будут сообщения о недоступности файлов dll или so, то придется архиватором распаковать org.eclipse.swt.win32.win32. x86_3.х.у.jar и извлечь из него недостающие файлы (например, swt-win32-3235.dll), поместив их в папку проекта Java. Примерное содержимое папки проекта, созданного оболочкой, выглядит так:

15

.settings

│ <Папка>

Пакет

│ <Папка>

.classpath

404

.project

508

swt-win32-3235.dll

323584

org.eclipse.swt.win32.win32.x} 1611970

На вкладке «Выполнить/Выполнить/Аргументы» в окне «Аргументы VM» строкой «-Djava.library.path="путь"» задать путь поиска необходимых библиотек при работе виртуальной машины во время исполнения приложения. Например,

-Djava.library.path="./"

1.2 Запуск SWT программы из командной строки

Для запуска программы вне оболочки Eclipse можно использовать следующие варианты исполнения программы.

а) Запуск из файла класса

1)Находясь в папке с проектом SWT, например, C:\eclipse\SWTHello, поместить в нее файл org.eclipse.swt.win32.win32.x86_3.1.1.jar или его аналог соответствующей версии из папки C:\Program Files\eclipse\plugins\

2)Извлечь из него архиватором файл swt-win32-3139.dll и поместить его здесь же. Если этого не сделать, то виртуальная машина (VM) не находит библиотеку в архиве и выдает сообщение похожее на Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3139 in java.library.path ...

3)Поместить файл с программой HelloSwt.class во вложенную в SWTHello папку, например, SWT

4)Запустить программу командой (записывать одной строкой):

java -cp "./org.eclipse.swt.win32.win32.x86_3.1.1.jar";./ -Djava.library.path="./" SWT.HelloSwt

б) Запуск SWT программы из архива.

1) Создать папку проекта, например, C:\tmp\MySWT и поместить в нее файл MANIF со следующим содержимым

Manifest-Version: 1.0 Main-Class: SWT. HelloSwt

Содержимое этого файла будет использовано при создании манифеста архива.

16

В параметре Main-Class значение SWT.HelloSwt определяет стартовый класс, содержащий метод main для исполнения. Измените это имя класса для запуска другого проекта.

2)Создать в MySWT папку, например, SWT и поместить в нее все файлы классов приложения (с расширением .class). Файлы с расширением .java помещать не требуется (но можно по желанию передать заказчику исходный код приложения).

3)Из архива org.eclipse.swt.win32.win32.x86_3.1.1.jar извлечь swt-win32- 3139.dll и поместить в папку MySWT.

4)Сюда же извлечь папку org со всем ее содержимым. Все необходимые файлы классов и .dll, таким образом, будут размещаться в папке проекта.

5)Находясь в папке MySWT выполнить команду создания архива

jar cmf manif swt.jar *

В результате содержимое папки MySWT примерно будет иметь вид:

org

¦ <Папка>

SWT

 

¦ <Папка>

MANIF

¦

46

swt-win32-3139.dll

¦

315392

swt.jar

¦ 1375657

6) Запуск на исполнение программы производится из папки MySWT командой

java -jar swt.jar

Примечание: Имена папок MySWT и SWT, файлов MANIF и swt.jar можно выбирать по своему усмотрению. Для более полного знакомства с материалом следует изучить раздел по созданию jar-архивов в руководстве по JDK.

1.3 Структура приложения

При добавлении элементов GUI с помощью расширений рабочей среды платформы механизмами запуска SWT управляет рабочая среда. Если вы разрабатываете приложение SWT с нуля без использования рабочей среды, то вам необходимо знать структуру приложения SWT.

Структура обычного автономного приложения SWT предполагает выполнение следующих шагов:

17

-создание экрана (экземпляр класса Display), представляющий сеанс SWT;

-создание одной или нескольких оболочек (экземпляр класса Shell), которые будут служить главными окнами приложения;

-создание входящих в оболочку необходимых виджетов;

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

-открытие окна оболочки;

-запуск цикла обработки событий с заданием условие выхода, которое обычно представляет собой закрытие окна оболочки;

-удаление объекта экрана.

Класс Display представляет собой мостик между SWT и системой GUI платформы. Обычно экраны используются для управления циклом событий платформы и контроля связи подпроцессов GUI с остальными процессами приложения. Этот шаблон подходит для большинства приложений. Перед созданием какого-либо окна следует создать класс экрана, а при закрытии окна его следует освободить. Если вы не разрабатываете многопоточное приложение, то для экрана больше ничего не нужно.

Класс Shell — это "окно" управляемое администратором окон платформы. Окна верхнего уровня являются потомками экрана. При работе с приложением эти окна можно перемещать, изменять их размеры, свертывать и развертывать. Вторичные окна являются потомками других окон. Обычно эти окна используются для диалога или как временные окна, существующие только

вконтексте окна хозяина.

Увсех виджетов, не являющихся окнами верхнего уровня, должны быть предки. У окон верхнего уровня предков нет, но они при создании связываются с конкретным родительским объектом (класса Display). К этому окну можно обратиться с помощью getDisplay(). Все остальные виджеты создаются как потомки (прямые или непрямые) окон верхнего уровня. Виджеты класса Composite могут иметь окна-потомки. Окно приложения можно назвать деревом виджетов или иерархией, чьим корнем является дисплей. В зависимости от сложности приложения потомков может быть один или несколько, или даже многоуровневые составные виджеты с потомками.

Стили. Некоторые свойства виджета указываются при его создании и изменению уже не подлежат. Например, список может быть с одиночным или с множественным выбором, с полосой прокрутки или без. Эти свойства называются стилями и задаются в конструкторе. Все конструкторы виджетов

18

получают аргумент типа int, который указывает поразрядную сумму "ИЛИ" всех желаемых стилевых констант. В некоторых случаях стиль считается факультативным, дополнительным. Это означает, что он может поддерживаться не всеми платформами, и в тех платформах, которые его не поддерживают, будет проигнорирован.

Константы стилей описаны в классе SWT в виде общих статических полей. Список применимых констант для каждого класса виджета можно найти в справочнике по API для SWT.

Освобождение ресурса. При работе с SWT различные платформы требуют явного выделения и освобождения ресурсов ОС. Согласно принципам проектирования SWT требуется явно освобождать запрошенные у ОС ресурсы. В SWT для освобождения ресурсов, связанных с конкретным объектом, используется метод dispose() экземпляра класса Widget.

Практическое правило: если вы создали объект, вы должны его удалить. Ниже приведены несколько основных правил удаления объектов:

-если виджет или графический объект создается с помощью конструктора, по окончании работы с этим объектом его следует удалить вручную;

-при освобождении объекта класса Composite также освобождаются и все ее дочерние виджеты. В этом случае вам не требуется удалять сами эти виджеты, но требуется удалить (освободить) все графические контексты, связанные с этими виджетами;

-если виджет или графический объект вы получаете без использования конструктора (например, Control.getBackground()), удалять его вручную не нужно, так как он создан не вами;

-если вы передаете ссылку на ваш виджет или графический объект другому объекту, то удалять его ни в коем случае нельзя, поскольку объект еще используется;

-если вы создаете графический объект для использования в течение жизненного цикла одного из виджетов, то при удалении виджета следует удалить и объект. Это можно сделать, зарегистрировав для виджета получателя запросов на удаление, и удалив в нем графический объект при получении события dispose.

Уэтих правил есть только одно исключение. Простые объекты данных, например, Rectangle и Point, не используют ресурсы операционной системы. Они не поддерживают метод dispose(), и их удалять не нужно. В случае сомнений посмотрите документацию для конкретного класса.

19

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