410013796724260
• Webmoney
R335386147728
Z369087728698
Shell, ShellListenerЭкземпляры класса Shell с точки зрения интерфейса представляют собой «окна» рабочего стола. Если Shell создается без родителя, т.е. конструктор в качестве параметра принимает только значение Display, то данный экземпляр будет родительским для всех остальных окон приложения. Окна Shell, которым при создании в конструктор в качестве аргумента передается родитель, будут дочерними или диалоговыми. Конструкторы Shell// Создание экземпляра окна Shell() // Создание экземпляра родительского окна Shell(Display display) // Создание экземпляра родительского окна определенного стиля, // определяющего внешний вид и поведение Shell(Display display, int style) // Создание экземпляра окна определенного стиля, определяющего // внешний вид и поведение Shell(int style) // Создание экземпляра дочернего окна Shell(Shell parent) // Создание экземпляра дочернего окна определенного стиля, определяющего // внешний вид и поведение Shell(Shell parent, int style) Стили ShellShell может использовать стили BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE, ON_TOP, TOOL, SHEET MODELESS, APPLICATION_MODAL, PRIMARY_MODAL, SYSTEM_MODAL. Стили окон могут комбинироваться. Если стиль окна установлено «модальным», то window manager блокирует работу с другими окнами экрана :
Примечание: при определении в стиле модальности окна можно использовать один из трех доступных стилей. Класс SWT включает два «комбинированных» стиля :
Окна Shell в интерфейсе могут быть представлены в «развернутом» (maximized), в «свернутом» (minimized) или в «нормальном» (normal) состоянии. Если реализации Shell будет определено состояние «maximized», то window manager развернет окно так, чтобы оно заняло всю видимую область экрана (display). В развернутом состоянии размер Shell не может быть изменен, даже если оно имеет стиль RESIZE. Если Shell находится в нормальном состоянии, то внешний вид окна контролируется стилями, которые были определены на этапе создания. Размер окна может быть изменен, если окно имеет соответствующий стиль. Если стиль окна «minimized», то интерфейс окна (клиентская область) не виден. В зависимости от window manager окно может быть «свернуто» в иконку или скрыто. Основные методы Shell
Слушатель окна ShellListener, ShellAdapterСлушатель окна ShellListener позволяет перехватить сообщения об активации/деактивации окна, сворачивании/разворачивании окна, закрытии окна. В следующем коде к окну shell поключается слушатель ShellAdapter, включающий соответствующие методы. Display display = new Display (); final Shell shell = new Shell (display); shell.setText("Пример Shell Listener"); shell.addShellListener(new ShellAdapter() { // Метод обработки события закрытия окна @Override public void shellClosed(ShellEvent e) { } // Метод обработки события активации окна @Override public void shellActivated(ShellEvent e) { } // Метод обработки события деактивации окна @Override public void shellDeactivated(ShellEvent e) { } // Метод обработки события разворачивании окна @Override public void shellDeiconified(ShellEvent e) { } // Метод обработки события сворачивания окна @Override public void shellIconified(ShellEvent e) { } }); Использование ShellListener - это не единственный способ перехватывания соответствующего события. Можно использовать и обычного слушателя Listener. В следующем коде к shell подключается Listener, который перехватывает событие закрытия окна. shell.addListener (SWT.Close, new Listener() { @Override public void handleEvent(Event event) { } }); Пример слушателя закрытия окна ShellВ следующем примере в зависимости от значения adapter к Shell подключается один из слушателей, который перехватывает событие «закрытия окна» и вызывают перезагруженную функцию confirmExit для подтверждения завершения работы. Функция confirmExit открывает модальное диалоговое окно MessageBox в приложении (стиль SWT.APPLICATION_MODAL) с размещением в интерфейсе двух кнопок OK и Cancel. import org.eclipse.swt.*; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.widgets.*; public class ShellTest { private static boolean adapter = true; private static int confirmExit(Shell shell) { int style = SWT.APPLICATION_MODAL | SWT.OK | SWT.CANCEL; MessageBox messageBox = new MessageBox (shell, style); messageBox.setText ("Подтверждение выхода"); messageBox.setMessage ("Закрыть окно?"); return messageBox.open(); } private static int confirmExit(Shell shell, ShellEvent event) { return confirmExit(shell); } public static void main (String [] args) { Display display = new Display (); final Shell shell = new Shell (display, SWT.SHELL_TRIM); shell.setText("Пример Shell"); if (adapter) { shell.addListener (SWT.Close, new Listener() { @Override public void handleEvent(Event event) { event.doit = confirmExit(shell) == SWT.OK; } }); } else { shell.addShellListener(new ShellAdapter() { @Override public void shellClosed(ShellEvent event) { event.doit = confirmExit(shell, event) == SWT.OK; } @Override public void shellActivated(ShellEvent e) {} @Override public void shellDeactivated(ShellEvent e) {} @Override public void shellDeiconified(ShellEvent e) {} @Override public void shellIconified(ShellEvent e) {} }); } // shell.pack(); shell.open(); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); System.exit(0); } } Интерфейс окна примера слушателя закрытия Shell представлен на следующем скриншоте. Пример контроля свойства modify окна ShellВ следующем примере выполняется контроль свойства modify окна при его закрытии. Для этого к Shell подключается слушатель, который перехватывает событие закрытия окна и вызывает метод getModified(). Окно изменено, если метод возвращает true. В интерфейсе окна размещается текстовое поле text, к которому подключается слушатель события изменения SWT.Modify. При внесении изменения в текстовое поле слушатель устанавливает свойству окна modify значение true, которое можно сбросить (false), используя соответствующий пункт меню. Листинг примера ShellModifiedTestimport org.eclipse.swt.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; public class ShellModifiedTest { private static Display display; private static Shell shell; private static String MESSAGE = "У Вас имеются несохраненные данные." + "\nЗавершить работу?"; public ShellModifiedTest() { shell.setText ("Контроль состояния окна"); // Создание меню createMenu(); int style = SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER; Text text = new Text (shell, style); text.addListener (SWT.Modify, new Listener() { @Override public void handleEvent(Event event) { shell.setModified (true); } }); text.setText("Тестовая строка для изменения состояния окна."); shell.setLayout (new FillLayout()); } public static void main(String[] args) { display = new Display(); shell = new Shell(display); new ShellModifiedTest(); shell.open (); shell.addListener (SWT.Close, new Listener() { @Override public void handleEvent(Event event) { if (shell.getModified()) { int style = SWT.PRIMARY_MODAL | SWT.OK | SWT.CANCEL; MessageBox box = new MessageBox (shell, style); box.setText (shell.getText ()); box.setMessage (MESSAGE); event.doit = box.open () == SWT.OK; } } }); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep (); } display.dispose (); } } Интерфейс примера контроля состояния окна Shell представлен на следующем скриншоте. В методе createMenu() создается основное меню «Файл», включающее подпункт «Сохранить», по нажатию на который свойство окна modify сбрасывается. Подробное описание работы с меню библиотеки SWT представлено на странице Menu Popup MenuItem. Листинг процедуры создания менюprivate void createMenu() { Menu bar = new Menu (shell, SWT.BAR); shell.setMenuBar (bar); MenuItem fileItem = new MenuItem (bar, SWT.CASCADE); fileItem.setText ("Файл"); Menu fileMenu = new Menu (shell, SWT.DROP_DOWN); fileItem.setMenu (fileMenu); MenuItem saveItem = new MenuItem (fileMenu, SWT.PUSH); saveItem.setText ("Сохранить\tCtrl+S"); saveItem.setAccelerator (SWT.MOD1 + 'S'); saveItem.addListener (SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { shell.setModified (false); } }); MenuItem exitItem = new MenuItem (fileMenu, SWT.PUSH); exitItem.setText ("Выход\tCtrl+Q"); exitItem.setAccelerator (SWT.MOD1 + 'Q'); exitItem.addListener (SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { shell.close (); } }); } Интерфейс примера контроля состояния окна с раскрытым пунктом меню на следующем скриншоте. Скачать примеры ShellРассмотренные примеры Shell в виде проекта Eclipse, включающего библиотеки SWT для 32- и 64- разрядных Windows, можно скачать здесь (5.76 Мб). |