- •Обозначения и сокращения
- •Введение
- •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 Пример приложения с элементами анимации
- •Список использованных источников
4 Графика
SWT предоставляет механизм для прорисовки графических объектов и показа изображений в виджетах. Очень многие задачи могут быть выполнены без необходимости программировать графический интерфейс, поскольку виджеты сами управляют прорисовкой значков, текста и других необходимых данных. Но если в вашем приложении отображаются пользовательские графические объекты или вы реализуете свой виджет с графикой, то вам следует знать некоторые основы рисования объектов в SWT (таблица 4.1).
Таблица 4.1 – Интерфейсы и классы пакета graphics
Интерфейсы пакета graphics
Реализации Drawable могут иметь графический Drawable контекст (GC), созданный для них, и затем они могут
рисовать, посылая сообщения своему GC
Классы, которые реализуют этот интерфейс ImageLoaderListener обеспечивают методы, которые имеют дело с
пошаговой загрузкой данных образа
|
Классы пакета graphics |
|
|
Объекты этого класса управляют ресурсами |
|
Color |
операционной системы, которые осуществляют цветовую |
|
|
модель RGB |
|
|
Объекты этого класса управляют ресурсами |
|
Cursor |
операционной системы, которые определяют появление |
|
|
экранного указателя |
|
Device |
Этот класс является абстрактным суперклассом всех |
|
устройств, таких как, например, дисплей и принтер |
||
|
||
DeviceData |
Определяет данные для устройства |
|
|
Объекты этого класса управляют ресурсами |
|
Font |
операционной системы, которые определяют как текст |
|
|
выглядит на экране |
|
FontData |
Объекты этого класса описывают шрифты операционной |
|
системы |
||
|
||
|
Объекты этого класса обеспечивают информацию |
|
FontMetrics |
измерения о шрифтах, включая возвышение, наклон, |
|
высота, пространство между колонками и среднюю |
||
|
||
|
ширину символов |
104
GC |
Класс GC реализует все возможности рисования, которые |
|
поддерживаются SWT |
||
|
||
|
|
|
|
Объекты этого класса являются описаниями GC с точки |
|
GCData |
зрения платформо-специфических полей данных. |
|
|
Никогда не используются явно |
|
Image |
Объекты этого класса являются рисунками, которые |
|
подготовлены в других пакетах |
||
|
||
ImageData |
Объекты этого класса являются машинонезависимыми |
|
описаниями образов |
||
|
||
ImageLoader |
Объекты этого класса использованы, чтобы загружать и |
|
сохранять образы в файле или потоке |
||
|
||
ImageLoaderEvent |
Объекты этого класса посылки сообщений в результате |
|
пошаговой загрузки данных образа |
||
PaletteData |
Объекты этого класса описывают цветовые данные |
|
использованные образом |
||
|
||
Path |
Объекты этого класса представляют пути в двумерной |
|
системе координат |
||
|
||
PathData |
Объекты этого класса описывают машинонезависимые |
|
пути |
||
|
||
Pattern |
Объекты этого класса представляют образцы, |
|
используемые в чертеже |
||
|
||
Point |
Объекты этого класса представляют точки (x, y) на |
|
координатной плоскости |
||
|
||
Rectangle |
Объекты этого класса представляют прямоугольные |
|
области в системе координат (x, y) |
||
|
||
|
Объекты этого класса представляют области системы |
|
Region |
координат, которые есть агрегаты областей, покрытых |
|
|
множеством многоугольников |
|
Resource |
Этот класс является абстрактным суперклассом всех |
|
графических объектов |
||
|
||
|
Объекты этого класса являются описаниями цветов с |
|
RGB |
точки зрения первичной цветовой модели сложения |
|
|
цветов (красный, зеленый и синий) |
|
TextLayout |
TextLayout — графический объект, который представляет |
|
типовой текст |
||
|
||
TextStyle |
TextStyle – набор стилей, которые могут быть приложены |
105
к фрагменту текста
Объекты этого класса представляют матрицы Transform преобразования для точек, выраженных как пары (x, y)
чисел с плавающей точкой
Графический контекст
Графический контекст (GC) – это центральное звено для поддержки графики в SWT. Его API содержит все функции работы с графикой в SWT. С помощью GC можно создавать графические изображения в элементах управления (самое распространенное применение), отображать рисунки на экране или на принтере. При рисовании управляющего элемента применяется GC, который передается в событии paint управляющего элемента. При рисовании изображения и выводе его на экран или принтер для него следует создать объект GC, а по окончании работы с ним – освободить GC.
Получив GC, можно установить его атрибуты: цвет, толщина линии и шрифт. Эти атрибуты управляют внешним видом рисунка в заданном GC. Полный набор функций работы с графикой описывается в справочнике по API для GC.
Шрифты
Управление шрифтами в SWT осуществляется с помощью классов Font и FontData. Класс FontData описывает характеристики шрифта. Объекты FontData можно создать путем указания названия, стиля и размера шрифта. В FontData входят API для запроса этих атрибутов. Так как ресурсы ОС для FontData не выделяются, освобождать его не нужно.
Класс Font — это фактически графический объект, представляющий шрифт, используемый в API рисунка. Если необходимо создать Font для Display, то для требуемого шрифта следует указать Display и FontData. Также можно запросить Font для объекта FontData. По окончании использования выделенный Font следует освободить.
Цвета
Управление цветом аналогично управлению шрифтами. Если требуется создать объект класса Color для Display, то указываются RGB-характеристики желаемого цвета. По окончании работы с выделенным цветом его следует освободить.
Метод getSystemColor(int) класса Display позволяет запрашивать предопределенные системные цвета для платформы ОС. Полученные таким образом цвета освобождать не нужно.
106
Изображения
Для управления изображениями в SWT служат классы Image, ImageData
и ImageLoader.
Класс ImageData относится к самим пикселам изображения, описывая используемые цвета с помощью класса PaletteData. Класс ImageData — это машинно- и платформонезависимое описание изображения.
Класс ImageLoader загружает и сохраняет ImageData в различных форматах файлов. SWT поддерживает загрузку и сохранение различных форматов: BMP (растровое изображение Windows), ICO (значок Windows), JPEG, GIF и PNG.
Класс Image – это фактически и есть графический объект, представляющий собой изображение, с которым работает API. Изображение создается для конкретного объекта класса Display. Изображения можно создавать следующими способами:
•инициализировать содержимое изображения с помощью ImageData;
•скопировать существующий объект класса Image;
•загрузить объект класса Image из файла.
Вы должны удалять экземпляр класса Image независимо от того, как он был создан.
Жизненный цикл графического объекта
Для большинства графических объектов в SWT выделяются ресурсы, поэтому эти ресурсы необходимо явно освобождать. Для этого применяются те же правила, что и описанные выше. Если объект создается с помощью конструктора, то его следует удалить. Если обращение к объекту осуществляется откуда-либо еще, то объект удалять нельзя.
Создание. Ресурсы ОС для таких графических объектов, как графические контексты, шрифты, цвета и изображения, выделяются сразу при создании объекта. Определение момента создания объекта зависит от того, как вы планируете его использовать.
Графические объекты, которые планируется интенсивно использовать на протяжении всего приложения, создаются при создании виджетов. Обычно к таким объектам относятся цвета и шрифты. В других случаях графические объекты удобнее создавать "на лету". Например, можно создать графический контекст, выполняющий какие-либо вычисления, в одном из обработчиков события виджета.
107
Если вы реализуете пользовательский виджет, то ресурсы для "постоянных" графических объектов обычно выделяются в конструкторе. Если объект "временный", или зависит от состояния каких-либо атрибутов, то можно выделять для него ресурсы "на лету".
Прорисовка. После создания графического объекта можно начинать его прорисовку. Прорисовку всегда следует делать в получателе запросов paint. Изредка бывает необходимо (особенно при реализации пользовательских виджетов), осуществлять прорисовку при обработке какие-либо других событий. Но вообще-то это не одобряется. Если все же такая необходимость есть, следует сначала попытаться воспользоваться методом redraw(), служащим для генерирования другого события paint. Рисование вне метода paint негативно сказывается на оптимизации платформы и может привести к ошибкам, если в очереди скопится много ожидающих событий paint.
При получении события paint вы получите готовый GC для рисования в виджете. Этот GC освобождать не нужно! Он создан не вами.
Ресурсы для всех остальных графических объектов должны выделяться при обработке события (или до обработки). Ниже приведен фрагмент кода, основанный на примере org.eclipse.swt.examples.HelloWorld5. Красный цвет был создан раньше, при создании виджета, поэтому здесь можно его использовать.
shell.addPaintListener (new PaintListener () { public void paintControl (PaintEvent event) {
GC gc = event.gc; gc.setForeground (red);
Rectangle rect = event.widget.getClientArea (); gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width -
20, rect.height - 20); gc.drawString(resHello.getString("Hello_world"), rect.x +
20, rect.y + 20);
}
});
Освобождение ресурсов. Каждый графический объект, для которого при создании выделены ресурсы, необходимо удалять по окончании работы с ним. Момент удаления зависит от времени создания объекта. Если при создании виджета создается графический объект, то к виджету, как правило, добавляется получатель запросов освобождения, который при удалении виджета освобождает этот объект. Если объект создается "на лету" при обработке paint, то его следует освободить по окончании прорисовки.
В следующем фрагменте показана слегка измененная версия получателя запросов прорисовки. В этом примере во время прорисовки выделяются и освобождаются ресурсы для красного цвета.
108