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 еще много возможностей для инноваций.