Статьи

Туманность: больше возможностей для приложений SWT

Standard Widget Toolkit (SWT) предоставляет разработчикам Java альтернативу Swing с собственным доступом к виджетам. Однако иногда виджетов, предоставляемых в SWT, недостаточно, особенно если вы хотите создать более современное приложение. Вы можете расширить виджеты SWT самостоятельно или воспользоваться преимуществами проекта Nebula .

Во главе с Томом Шиндлом проект в настоящее время находится в стадии инкубации (и уже довольно давно) Проект полон простых в использовании компонентов, таких как календарь, галерея и полка. В этой статье я приведу краткий обзор виджетов календаря и галереи с некоторыми примерами.

Настройка приложения

Мы будем использовать виджеты Nebula в простом представлении приложения Eclipse RCP. Чтобы быстро запустить приложение, просто используйте мастер New / Project … / Plug-in Project и используйте один из шаблонов для создания приложения RCP. 

Мы будем модифицировать класс View, сгенерированный в этом шаблоне проекта, чтобы он содержал наши виджеты Nebula.

Нам не нужен просмотрщик таблиц, который предоставляется здесь по умолчанию, поэтому вам нужно закомментировать код, предоставленный в методах setFocus () и createPartControl () .

Основа нашего нового метода createPartControl () будет выглядеть следующим образом, заставляя представление занимать экран.

	public void createPartControl(Composite parent) 
{
parent.setLayout(new FillLayout())
//our widget code will go here
}

Каждый из виджетов, которые мы будем использовать здесь, доступен для отдельной загрузки — для этого набора примеров мы будем использовать Gallery и CDateTime. Как только вы загрузите их, сохраните их в каталоге плагинов. 

Не забывайте, что когда вы запускаете приложение после изменения зависимостей, вам необходимо убедиться, что необходимые плагины находятся в конфигурации запуска. Вы можете просто использовать кнопку «Добавить обязательные подключаемые модули» на вкладке «Подключаемые модули» диалогового окна «Выполнить настройку», чтобы устранить любые проблемы с зависимостями. 

Селекторы календаря и времени

Начнем с простого примера виджета туманности — селектора даты и времени. Если вы загрузили CDateTimeplugin, вы сможете добавить его в качестве зависимости через plugin.xml вашего приложения RCP как org.eclipse.nebula.widgets.cdatatime

 

Использовать компонент очень просто, нам просто нужно добавить его в наш метод createPartControl (). Сначала давайте просто добавим селектор даты, используя стиль CDT.SIMPLE:

CDateTime cdt = new CDateTime(parent, CDT.BORDER | CDT.SIMPLE);
cdt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));

Этот код будет производить следующее:

Далее давайте создадим более сложную версию, которая включает выбор времени, используя стиль CDT.TIME_MEDIUM:

CDateTime cdt = new CDateTime(parent, CDT.BORDER | CDT.COMPACT | CDT.DROP_DOWN 
| CDT.DATE_LONG | CDT.TIME_MEDIUM);
cdt.setSelection(new Date());
cdt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

Это позволяет выбрать дату следующим образом:

Если вы нажмете на значок часов, который предоставляется как часть диалога, вы сможете выбрать время из виджета часов: 

 

 

Галерея 

Еще раз, вам нужно добавить соответствующий плагин в ваши зависимости, в этом случае это будет org.eclipse.nebula.widgets.gallery.

Для начала нам нужно создать сам виджет Галерея. 

final Gallery gallery = new Gallery(parent, SWT.V_SCROLL | SWT.VIRTUAL);
gallery.setVirtualGroups(true);

Обратите внимание, что я использовал SWT.VIRTUAL, а не SWT.MULTI здесь. Мы отображаем нашу галерею в виде виртуальной таблицы, которая дает преимущества в использовании по сравнению со стандартными таблицами. Виртуальные таблицы ограничивают создание TableItem только теми элементами, которые пользователь может видеть в то время. Для чего-то вроде галереи это важно.

Следующим шагом является создание средств визуализации как для группы, так и для элементов. Каждый элемент может иметь определенный размер в группе — здесь мы устанавливаем его в 64×64. 

		// Group Renderer
DefaultGalleryGroupRenderer gr = new DefaultGalleryGroupRenderer();
gr.setItemSize(64, 64);
gr.setMinMargin(3);
//Item Renderer
DefaultGalleryItemRenderer ir = new DefaultGalleryItemRenderer();

gallery.setGroupRenderer(gr);
gallery.setItemRenderer(ir);

Далее мы можем установить, сколько групп принадлежит в галерее: 

gallery.setItemCount(1);

Наконец, давайте заполним галерею, используя содержимое одной папки:

GalleryItem parentItem = gallery.getItem(0);
//use a folder name
if(parentItem.getParentItem() == null)
{
parentItem.setText("C:\\Images");
//add the contents of the folder
File f = new File("C:\\Images");
File[] contents = f.listFiles();

//set number of items in this group
parentItem.setItemCount(contents.length);

for(int i =0; i < contents.length; i++)
{
String imgFilePath = contents[i].getAbsolutePath();

ImageLoader loader = new ImageLoader();
GalleryItem subItem = parentItem.getItem(i);
Image img = new Image(parent.getDisplay(), loader.load(imgFilePath)[0]);
subItem.setImage(img);

}


}

Первоначально все группы отображаются в соответствии с контрактом. Когда вы расширите его, вы должны увидеть что-то вроде этого: 

 

 

Вывод 

Как вы можете видеть, в Nebula есть что-то, что вы можете сделать сами с помощью базовых виджетов SWT. С e4 станет еще больше возможностей для конфигурирования, но для пользователей потока 3.x Eclipse и SWT еще много возможностей для инноваций.