410013796724260
• Webmoney
R335386147728
Z369087728698
Toolbar, ToolItem, IconCacheПанель инструментов ToolBar библиотеки SWT в интерфейсе приложения представляет набор кнопок, расположенных между рабочей областью и основным меню. ToolBar позволяет подключить вызов часто используемых функций к нажатию на кнопку. Интерфейс кнопки панели инструментов может иметь текст, значок или текст со значком. К кнопке можно подключить строку подсказки. Библиотека SWT включает класс панели инструментов ToolBar и кнопки панели инструментов ToolItem пакета org.eclipse.swt.widgets. Конструктор ToolBarpublic ToolBar(Composite сomposite, int style); Конструктор ToolBar создает панель инструментов и размещает её в сomposite. Для определения размеров панели инструментов следует использовать метод setSize(int width, int height). Для локализации местоположения используется метод setLocation(int x, int y). При создании ToolBar можно использовать следующие стили style :
Некоторые стили, например RIGHT и WRAP, можно использовать совместно. По умолчанию панель инструментов создается с горизонтальным расположением кнопок.
Кнопки панели инструментов ToolItemКонструктор класса ToolItem в качестве параметров принимает значение ToolBar и стиль создаваемой кнопки. public ToolItem(ToolBar toolBar, int style); Имеется 5 стилей, которые можно использовать для создания ToolItem.
Чтобы создать в панели инструментов компонент в виде текстового поля следует использовать следующий код : final ToolItem textItem = new ToolItem(bar, SWT.PUSH); textItem.setText("Open Child"); Для размещения в панели инструментов компонента в виде раскрывающегося меню в качестве примера приводится следующий код : Display display = new Display(); Shell shell = new Shell (display); final ToolBar toolBar = new ToolBar(shell, style); final ToolItem itemEdit = new ToolItem(toolbar, SWT.PUSH); itemEdit.setImage("edit.gif"); itemEdit.setToolTipText("Редактирование"); // Создание раскрывающегося меню final Menu menu = new Menu(shell, SWT.POP_UP); new MenuItem(menu, SWT.PUSH).setText("Копировать"); new MenuItem(menu, SWT.PUSH).setText("Вставить"); new MenuItem(menu, SWT.SEPARATOR); new MenuItem(menu, SWT.PUSH).setText("Вырезать"); itemEdit.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { Rectangle bounds = itemEdit.getBounds(); Point point = toolBar.toDisplay(bounds.x, bounds.y + bounds.height); menu.setLocation(point); menu.setVisible(true); } }); В примере для кнопки itemEdit используется стиль SWT.PUSH вместо SWT.DROP_DOWN. Положение окна раскрывающегося меню "локализуется" на этапе нажатия на кнопку. Необходимо отметить, что интерфейс кнопки панели инструментов можно "условно" разделить на 2 части : область изображения в верхней части и область текста в нижней. Если текст отсутствует во всех кнопках панели инструментов, то размер кнопок будет определяться максимальным размером используемых изображений. Если для одной из кнопок дополнительно включить текст, то высота всех кнопок автоматически увеличивается на размер текста, также изменится и ширина кнопок. Пример создания панели инструментов ToolBarРазработать программный модуль на все случаи жизни практически невозможно, но стремится к этому следует. Как правило это относится к классам и методам, не связанными, или частично связанным с интерфейсом приложения. На странице будет представлено два программных модуля, которые можно с небольшими доработками использовать в своих программах. Один из модулей связан с созданием панели инструментов ToolBarCreater на основании массива данных. Второй модуль представляет собой кэш изображений IconCache, способный хранить набор различных иконок. Пример использования панели инструментов ToolBar библиотеки SWT включает следующие модули :
Интерфейс примера создания панели инструментов с раскрытым меню представлен на следующем скриншоте. Листинг модуля IconCache/** * Модуль хранения и управления изображениями приложения * @author E.Koklin * @version 1.0.0 */ import java.io.*; import java.util.*; import org.eclipse.swt.program.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.graphics.*; public class IconCache { // хранилище изображений private static ArrayList<Image> images = null; // хранилище связанных с программами иконок private static Hashtable<Program, Image> programs = null; // хранилище изображений курсоров private static Cursor сursors[] = null; private static String IMAGES_DIR = null; private final String ERROR_RESOURCE = "Could not load resources"; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Конструктор класса */ public IconCache() { if (images == null) images = new ArrayList<Image>(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура определения директории изображений * @param images_dir */ public void setImagesDir(final String images_dir) { IMAGES_DIR = images_dir; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура загрузки изображений * @param display дисплей * @param list список изображений */ public void loadImages(final Display display, final String[] list) { for (int i = 0; i < list.length; ++i) { Image image = extractImage(list[i]); if (image == null) { freeResources(); throw new IllegalStateException(ERROR_RESOURCE); } images.add(image); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура чтения системных курсоров * @param display дисплей * @param list список курсоров */ public void loadCursors(final Display display, final int[] list) { сursors = new Cursor[list.length]; for (int i = 0; i < list.length; ++i) { сursors[i] = display.getSystemCursor(list[i]); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Функция чтения изображения * @param idx идентификатор * @return изображение */ public Image getImage (final int idx) { Image image = images.get(idx); return image; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Функция освобождения ресурсов */ public void freeResources() { if (images.size() > 0) { for (int i = (images.size() - 1); i >= 0; i--) { final Image image = images.get(i); if (image != null) image.dispose(); } images = null; } images = null; if (programs != null) { for (Enumeration<Image> it = programs.elements(); it.hasMoreElements(); ) { Image image = (Image) it.nextElement(); image.dispose(); } } сursors = null; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Функция создания/чтения изображения * @param display дисплей * @param path относительный путь к иконке */ private Image extractImage(final Display display, String path) { InputStream stream = IconCache.class. getResourceAsStream (IMAGES_DIR + path); ImageData imageData = new ImageData (stream); ImageData mask = imageData.getTransparencyMask (); Image result = new Image (display, imageData, mask); try { stream.close (); } catch (IOException e) { e.printStackTrace (); } return result; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Функция получения изображения, связанного с программой * @param program программа */ public Image getProgramImage(Program program) { if (programs == null) programs = new Hashtable<Program, Image>(); Image image = (Image) programs.get(program); if (image == null) { ImageData imageData = program.getImageData(); if (imageData != null) { image = new Image(null, imageData, imageData.getTransparencyMask()); programs.put(program, image); } } return image; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Функция получения изображения по ключу * @param key ключ */ public Image getProgramImage(final String key) { Image image = (Image) programs.get(key); return image; } } Модуль IconCache включает три хранилища изображений : общее хранилише images, хранилище иконок программ programs, хранилище иконок курсоров сursors. Первое хранилище создается конструктором, остальные два по мере необходимости. Для загрузки в хранилище изображений необходимо использовать метод loadImages(final Display display, final String[] list), которому в качестве параметра передается массив наименований изображений list. Метод loadImages в цикле прокручивает список и вызывает функцию extractImage(final Display display, String path), создающую изображение. Следует обратить внимание, что директория изображений должна располагаться вместе с классами приложения и при создании исполняемого модуля jar располагается внутри архива. В противном случае, если изображения будут располагаться во внешней директории необходимо будет внести изменения в функцию extractImage, касающиеся чтения изображения. Поле IMAGES_DIR определяет директорию изображений. Для загрузки изображений курсоров используется метод loadCursors (final Display display, final int[] list). Параметр list содержит список курсоров библиотеки SWT. Связанные с программой изображения загружаются в хранилище в функции getProgramImage(Program program). При первом обращении к функции создается хранилище programs. Перед завершением работы приложения необходимо освободить ресурсы вызовом метода freeResources(). Пример использования модуля управления изображениями IconCache. private final String[] IMAGES = {"cut.gif", "copy.gif"}; private final int[] CURSORS = {SWT.CURSOR_WAIT, SWT.CURSOR_HAND, SWT.CURSOR_ARROW, SWT.CURSOR_HELP}; . . . Display display = new Display(); . . . // Создание IconCache IconCache iconCache = new IconCache(); iconCache.setImagesDir("/images/"); // Загрузка изображений в IconCache iconCache.loadIcons (display, IMAGES ); iconCache.loadCursors(display, CURSORS); // Загрузка и чтение изображения Excel Program program = Program.findProgram(".xls"); Image imageXLS = iconCache.getProgramImage(program); Интерфейс IToolBar.javaimport org.eclipse.swt.widgets.ToolBar; public interface IToolBar { public void selectToolbarItem (final ToolBar toolbar, final int idx); } Метод selectToolbarItem интерфейса IToolBar будет вызываться в модуле ToolBarCreater. Основное приложение, в котором используется модуль ToolBarCreater должно реализовывать интерфейс IToolBar. Модуль создания панели инструментов ToolBarCreater.java/** * Модуль создания панели инструментов * @author E.Koklin * @version 1.0.0 */ import java.util.ResourceBundle; import java.util.MissingResourceException; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; public class ToolBarCreater { private Shell shell ; private IToolBar parent; private ToolBar toolbar; // Стили кнопок private static final String STYLE_PUSH = "PUSH" ; private static final String STYLE_CHECK = "CHECK" ; private static final String STYLE_RADIO = "RADIO" ; public static final String STYLE_DROP_DOWN = "DROP_DOWN"; // Идентификаторы массива описания кнопок private final int TB_IDX = 0; // идентификатор рисунка private final int TB_IMAGE = 1; // наименование кнопки private final int TB_TOOLTIP = 2; // ресурсный текст подсказки private final int TB_TEXT = 3; // текст кнопки private final int TB_STYLE = 4; // стиль кнопки //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Конструктор * @param shell окно */ public ToolBarCreater (final Shell shell) { this.shell = shell; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Конструктор * @param shell окно * @param parent родитель */ public ToolBarCreater (final Shell shell, final IToolBar parent) { this(shell); this.parent = parent; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура определения родителя * @param parent родитель */ public void setParent(final IToolBar parent) { this.parent = parent; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура создания панели инструментов. * Перебор массива в цикле и формирование панели инструментов * @param resource ресурсный файл * @param list массив описания кнопок. * Формат : идентификатор, изображение, подсказка * @param style стиль панели инструментов * @return панель инструментов */ public ToolBar getToolBar(final ResourceBundle resource, final String[][] list, final int style) { // Определение кэша изображений IconCache iconCache = new IconCache(); // Панель инструментов toolbar = new ToolBar(shell, style); // Цикл создания кнопок панели инструментов for (int i = 0; i < list.length; i++) { if (list[i][TB_IDX] == null) { // Создание сепаратора/разделителя new ToolItem(toolbar, SWT.SEPARATOR); } else { ToolItem item = null; if ((list[i][TB_STYLE] != null) && (list[i][TB_STYLE].length() > 0) && (list[i][TB_IDX].length() > 0)) { // Создание кнопки if (STYLE_PUSH.equalsIgnoreCase(list[i][TB_STYLE])) item = new ToolItem(toolbar, SWT.PUSH); else if (STYLE_CHECK.equalsIgnoreCase(list[i][TB_STYLE])) item = new ToolItem(toolbar, SWT.CHECK); else if (STYLE_RADIO.equalsIgnoreCase(list[i][TB_STYLE])) item = new ToolItem(toolbar, SWT.RADIO); else if (STYLE_DROP_DOWN.equalsIgnoreCase(list[i][TB_STYLE])) item = new ToolItem(toolbar, SWT.DROP_DOWN); // Определение изображения if ((list[i][TB_IDX] != null) && (list[i][TB_IDX].length() > 0)) item.setImage(iconCache.getImage( Integer.valueOf(list[i][TB_IDX]))); // Определение подсказки if ((list[i][TB_TOOLTIP] != null) && (list[i][TB_TOOLTIP].length() > 0)) item.setToolTipText(getResourceString(resource, list[i][TB_TOOLTIP])); // Определение текста if ((list[i][TB_TEXT] != null) && (list[i][TB_TEXT].length() > 0)) item.setText(list[i][TB_TEXT]); // Определение идентификатора item.setData(i); // Определение слушателя item.addSelectionListener(listener); } } } return toolbar; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура создания панели инструментов. * Перебор массива в цикле и формирование панели инструментов * @param resource ресурсный файл * @param list массив описания кнопок. * Формат : идентификатор, изображение, подсказка * @return панель инструментов */ public ToolBar getToolBar(final ResourceBundle resource, final String[][] list) { return getToolBar(resource, list, SWT.NONE); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Функция чтения ресурсов * @param resource ресурсный файл * @param key ключ * @return строка ресурсов */ private String getResourceString(ResourceBundle resource, String key) { try { return resource.getString(key); } catch (MissingResourceException e) { return null; } catch (NullPointerException e) { return null; } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура добавления в панель инструментов кнопки * @param toolbar панель инструментов * @param image изображение * @param tooltip подсказка * @param style стиль [PUSH, CHECK] */ public void addToolItem (ToolBar toolbar, final Image image, final String tooltip, final int style) { if (image == null) // сепаратор new ToolItem(toolbar, SWT.SEPARATOR); else { // Создание кнопки ToolItem item = new ToolItem(toolbar, style); // Определение изображения item.setImage(image); // Определение подсказки item.setToolTipText(tooltip); // Определение идентификатора кнопки item.setData(toolbar.getItemCount() - 1); // Определение слушателя item.addSelectionListener(listener); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура добавления в панель инструментов кнопки * @param toolbar панель инструментов * @param image изображение * @param tooltip подсказка */ public void addToolItem (ToolBar toolbar, final Image image, final String tooltip) { addToolItem (toolbar, image, tooltip, SWT.PUSH); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Слушатель нажатия на кнопку панели инструментв */ SelectionListener listener = new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) {} @Override public void widgetSelected(SelectionEvent e) { // Если определен родитель, то передать ему обработку события if (parent != null) { // Кнопка панели инструментов ToolItem item = (ToolItem) e.getSource(); parent.selectToolbarItem(toolbar, (int)item.getData()); } } }; } В функцию создания панели инструментов getToolBar() в качестве параметров необходимо передать ресурсы resource для строки подсказки, массив кнопок list и стиль панели инструментов style. Функция getToolBar() создает панель инструментов и в цикле для каждого элемента массива формирует кнопку и помещает ее в ToolBar. При создании кнопки выполняется проверка наличия в описании иконки, подсказки и текста. Для каждой кнопки определяется идентификатор, размещаемый в свойстве Data (метод setData(idx)). Функция getToolBar() "перегружена", и может быть вызвана без параметра style. К каждой кнопке подключается слушатель нажатия listener, который вызывает метод selectToolbarItem интерфейса IToolBar родительского окна с передачей ему компонента Toolbar и идентификатора кнопки. Обработка события нажатия кнопки выполняется в родительском модуле. Перегруженный метод addToolItem позволяет динамически добавлять кнопки в панель инструментов после ее создания. Листинг приложения тестирования модулей ToolbarTest.javaВ программе ToolbarTest определяем массив изображений IMAGES, многомерный массив описания кнопок панели инструментов TOOLBAR, массив курсоров CURSORS и полный путь ресурсного файла resources. private final String[] IMAGES = {"cut.gif" , "copy.gif" , "delete.gif" , "parent.gif", "paste.gif" , "print.gif" , "refresh.gif", "search.gif", "shell.gif" , "file.gif" }; // FORMAT массив TOOLBAR - image.idx, image, resources, text, style private static String[][] TOOLBAR = { {"", "shell.gif" , null , "", ToolBarCreater.STYLE_DROP_DOWN}, {null}, {"", "cut.gif" , "cut" , "", ToolBarCreater.STYLE_PUSH}, {"", "copy.gif" , "copy" , "", ToolBarCreater.STYLE_PUSH}, {"", "paste.gif" , "paste" , "", ToolBarCreater.STYLE_PUSH}, {null}, {"", "refresh.gif", "refresh", "", ToolBarCreater.STYLE_PUSH}, {"", "search.gif" , null , "", ToolBarCreater.STYLE_PUSH}}; private final int[] CURSORS = {SWT.CURSOR_WAIT, SWT.CURSOR_HAND, SWT.CURSOR_ARROW, SWT.CURSOR_HELP}; private ResourceBundle resource = ResourceBundle.getBundle("resources/toolbar"); Описание кнопок панели инструментов соответствует формату, который определен в модуле ToolbarCreater. Кнопки-сепараторы представлены в массиве нулевыми (null) значениями. Листинг конструктора ToolbarTestДля создания панели инструментов в листинге конструктора ToolbarTest последовательно выполняются следующие действия :
public ToolbarTest(final Shell shell) { // Кэш изображений iconCache = new IconCache(); iconCache.setImagesDir("/images/"); // Загрузка изображений iconCache.loadImages (shell.getDisplay(), IMAGES); iconCache.loadCursors(shell.getDisplay(), CURSORS); // Установка иконки приложения shell.setImage(iconCache.getImage(ICON_SHELL)); // Определение идентификаторов кнопок панели инструментов for (int i = 0; i < TOOLBAR.length; i++) { if ((TOOLBAR[i][0] != null) && (TOOLBAR[i][1].length() > 0)) { for (int j = 0; j < IMAGES.length; j++) { if (IMAGES[j].equalsIgnoreCase(TOOLBAR[i][1])) { TOOLBAR[i][0] = String.valueOf(j); break; } } } } // Создание панели инструментов ToolBarCreater tbCreater = new ToolBarCreater(shell, this); // SWT.FLAT | SWT.HORIZONTAL SWT.VERTICAL toolBar = tbCreater.getToolBar(resource, TOOLBAR, SWT.FLAT); addDropdownMenu(shell); // Добавление в панель инструментов кнопок для Word и Excel tbCreater.addToolItem (toolBar, null, null); addProgramItem (shell, "test.doc"); addProgramItem (shell, "test.xls"); } Листинг метода addDropdownMenuВ этом методе создается раскрывающееся меню, которое подключается к определенной кнопке панели инструментов. private void addDropdownMenu(final Shell shell) { // Создание раскрывающегося меню menu = new Menu(shell, SWT.POP_UP); new MenuItem(menu, SWT.PUSH).setText("Открыть проект"); new MenuItem(menu, SWT.PUSH).setText("Закрыть проект"); new MenuItem(menu, SWT.SEPARATOR); new MenuItem(menu, SWT.PUSH).setText("Выйти"); final ToolItem itemDropDown = toolBar.getItem(MENU_DROPDOWN); // Удаление слушателя Listener listener = itemDropDown.getListeners(SWT.Selection)[0]; itemDropDown.removeListener(SWT.Selection, listener); itemDropDown.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { Rectangle bounds = itemDropDown.getBounds(); Point point = toolBar.toDisplay(bounds.x, bounds.y + bounds.height); menu.setLocation(point); menu.setVisible(true); } }); } Листинг метода addProgramItemВ этом методе создается кнопка панели инструментов, связанная с программой. private void addProgramItem (final Shell shell, final String fname) { String typeString = null; Image iconImage = null; Program program = null; int dot = fname.lastIndexOf('.'); if (dot != -1) { // Выделение расширения имени файла String extension = fname.substring(dot); // Определение программы program = Program.findProgram(extension); if (program != null) { typeString = program.getName(); iconImage = iconCache.getProgramImage(program); } } // Создание элемента панели инструментов ToolBarCreater tbCreater = new ToolBarCreater(shell, this); tbCreater.addToolItem (toolBar, iconImage, typeString, SWT.CHECK); } Листинг метода selectToolbarItemПрограмма ToolbarTest реализует интерфейс IToolBar, включающий метод selectToolbarItem. Данный метод вызывается по нажатию на кнопки панели инструментов. В методе анализируется идентификатор кнопки, в зависимости от значения которого вызывается соответствующий метод. Кнопка с идентификатором 0 связана с раскрывающимся меню, нажатие которого обрабатывается в отдельном методе, представленном в методе addDropdownMenu. /** * Реализация интерфейса IToolBar * @param toolbar - панель инструментов * @param idx - идентификатор кнопки * @see IToolBar */ @Override public void selectToolbarItem(final ToolBar toolbar, final int idx) { switch(idx) { case 0 : break; case 1 : tbCut() ; break; case 2 : tbCopy(); break; case 3 : tbPaste(); break; default : System.out.println ("idx = " + idx); } } private void tbCut () {} private void tbCopy () {} private void tbPaste() {} Скачать пример SWT ToolbarИсходный код рассмотренного примера SWT ToolbarTest в виде проекта Eclipse можно скачать здесь (4.73 Мб). Библиотека labir.utils.jar, используемая в примере, включает класс IconCache, полное описание которого (поля, методы) приведено на этой странице. |