Введение
Графический инструментарий для использования с платформой Java
Стандартный инструментарий виджетов (SWT) – это графический инструментарий для использования с платформой Java. Он был первоначально разработан Стивеном Нортовером в IBM и в настоящее время поддерживается Фондом Eclipse совместно с Eclipse IDE. SWT является альтернативой инструментариям графического пользовательского интерфейса (GUI) Abstract Window Toolkit (AWT) и Swing, предоставляемым Sun Microsystems в составе Java Platform, Standard Edition (J2SE). Для отображения элементов GUI, реализация SWT обращается к нативным библиотекам GUI операционной системы, используя Java Native Interface (JNI) подобно программам, написанным с применением специфичных для операционной системы API. Программы, использующие SWT, являются переносимыми, однако реализация инструментария, несмотря на то, что часть кода написана на Java, уникальна для каждой платформы. Инструментарий распространяется как бесплатное программное обеспечение с открытым исходным кодом под Eclipse Public License, одобренной Open Source Initiative.
История
Первым GUI-инструментарием Java был Abstract Window Toolkit (AWT), представленный вместе с Java Development Kit (JDK) 1.0 как один из компонентов платформы Java от Sun Microsystems. Изначальный AWT представлял собой простую Java-оболочку вокруг нативных (предоставляемых операционной системой) виджетов, таких как меню, окна и кнопки. Swing стал GUI-инструментарием следующего поколения, представленным Sun в Java Platform, Standard Edition (J2SE) 1.2. Swing был разработан для обеспечения более широкого набора компонентов программного обеспечения GUI, чем AWT. Элементы GUI Swing полностью реализованы на Java и не содержат нативного кода: вместо использования нативных компонентов GUI, Swing отрисовывает собственные компоненты, используя Java 2D для вызова низкоуровневых подпрограмм рисования операционной системы. История SWT берет начало в работе, которую компания Object Technology International (OTI) проводила в 1990-х годах, создавая кроссплатформенные, переносимые, нативные интерфейсы виджетов для Smalltalk, изначально для OTI Smalltalk, который в 1993 году стал IBM Smalltalk. Common Widget layer в IBM Smalltalk обеспечивал быстрый нативный доступ к различным наборам виджетов платформы, предоставляя при этом единый API и избегая проблемы "наименьшего общего знаменателя", характерной для других переносимых инструментариев графического пользовательского интерфейса (GUI). Компания IBM разрабатывала VisualAge – интегрированную среду разработки (IDE), написанную на Smalltalk. Они приняли решение открыть исходный код проекта, что привело к разработке Eclipse, предназначенной для конкуренции с другими IDE, такими как Microsoft Visual Studio. Eclipse написан на Java, и разработчики IBM, решив, что им необходим инструментарий с "нативным внешним видом" и "нативной производительностью", создали SWT в качестве замены Swing.
Дизайн
SWT — это оболочка вокруг объектов нативного кода, таких как объекты GTK, Motif и т. д. Из-за этого виджеты SWT часто называют «тяжёлыми», подразумевая лёгкую Java-обёртку вокруг «тяжёлого» нативного объекта. В случаях, когда нативные библиотеки графического интерфейса пользователя не поддерживают функциональность, необходимую для SWT, SWT реализует собственный код графического интерфейса на Java, подобно Swing. По сути, SWT — это компромисс между низкоуровневой производительностью и внешним видом AWT и простотой использования Swing на высоком уровне. Согласно Eclipse Foundation, «SWT и Swing — это разные инструменты, созданные с разными целями. Цель SWT — предоставить единый API для доступа к нативным виджетам на широком спектре платформ. Основными целями проектирования являются высокая производительность, нативный внешний вид и глубокая интеграция с платформой. Swing, с другой стороны, предназначен для обеспечения высоконастраиваемого внешнего вида и поведения, общего для всех платформ». Утверждается, что SWT имеет лаконичный дизайн, частично вдохновлённый Эрихом Гаммой, известным по книге Design Patterns. SWT — это более простой инструментарий, чем Swing, с меньшим количеством (возможно) избыточных функций для среднего разработчика. Это привело к тому, что некоторые считают, что SWT не хватает функциональности по сравнению со Swing. Джеймс Гослинг, создатель языка Java, утверждал, что SWT слишком прост и является сложным инструментарием для переноса на новые платформы по той же причине, что когда-то AWT имел проблемы с переносом: он слишком прост, слишком низкоуровневый и слишком тесно связан с Win32 GUI API, что затрудняет адаптацию API SWT к другим инструментам графического интерфейса, таким как Motif и OS X Carbon. Эта глубокая интеграция может быть полезна во многих отношениях, например, она позволяет SWT оборачивать объекты ActiveX в Microsoft Windows.
Выступление
SWT разрабатывался как высокопроизводительный инструментарий графического интерфейса, превосходящий Swing по скорости, отзывчивости и потреблению системных ресурсов. Были предприняты некоторые попытки сравнения производительности SWT и Swing, которые показали, что SWT должен быть эффективнее, однако приложения, использованные для этих тестов, были недостаточно сложными, чтобы сделать однозначные выводы для всех возможных сценариев использования SWT или Swing. Довольно подробный набор тестов показал, что ни Swing, ни SWT не демонстрируют существенного превосходства друг над другом в общем случае.
Расширяемость и сравнение с другим кодом Java
Из-за использования нативного кода, классы SWT не обеспечивают лёгкого наследования для всех классов виджетов, что, по мнению некоторых пользователей, может снизить расширяемость. Оба инструментария поддерживают создание новых виджетов исключительно на Java, однако в SWT требуется дополнительная работа для обеспечения корректной работы нового виджета на всех платформах. В противном случае могут возникнуть утечки памяти или другое нежелательное поведение. По этому поводу некоторые отмечают, что "явное освобождение ресурсов может стать шагом назад в плане времени разработки (и затрат), по крайней мере, для среднестатистического Java-разработчика", и что "это палка о двух концах. Это означает больший контроль (и большую сложность) для разработчика SWT вместо большей автоматизации (и снижения производительности) при использовании Swing". SWTSwing – это проект, предоставляющий Swing-бэкенд для SWT. По сути, SWT может быть запущен с использованием нативных объектов Swing вместо, например, GTK или нативных объектов Windows. Это позволит SWT работать на любой платформе, поддерживаемой Swing. Начиная с 2006 года, был создан порт SWT 3.2 на язык программирования D, известный как DWT. С тех пор проект поддерживает 32-битные версии Windows и Linux GTK для SWT 3.4. Проект DWT также включает в себя пакет дополнений, содержащий порт JFace и Eclipse Forms. С появлением JavaFX в составе платформы Java SE возник интерес к разработке бэкенда для SWT, использующего JavaFX аналогично тому, как SWTSwing использует Swing. Одним из заметных проектов, стремящихся к этому, был SWT on JavaFX, который в 2014 году стал частью e(fx)clipse.