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)

Стили Shell

Shell может использовать стили BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE, ON_TOP, TOOL, SHEET MODELESS, APPLICATION_MODAL, PRIMARY_MODAL, SYSTEM_MODAL. Стили окон могут комбинироваться.

Если стиль окна установлено «модальным», то window manager блокирует работу с другими окнами экрана :

  • PRIMARY_MODAL закрывает доступ к окну своего родителя;
  • APPLICATION_MODAL блокирует доступ ко всем окнам экрана приложения;
  • SYSTEM_MODAL закрывает доступ ко всем окнам разных приложений.

Примечание: при определении в стиле модальности окна можно использовать один из трех доступных стилей.

Класс SWT включает два «комбинированных» стиля :

  • SHELL_TRIM - комбинирование стилей TITLE | CLOSE | MIN | MAX | RESIZE, используется при создании типичного окна;
  • DIALOG_TRIM - комбинирование стилей TITLE | CLOSE | BORDER, используется при создании диалогового окна.
СтильОписаниеИнтерфейс
SWT.SHELL_TRIM Окно можно развернуть, свернуть и изменить размер
SWT.MAX | SWT.RESIZE Окно можно развернуть и изменить размер
SWT.MIN | SWT.RESIZE Окно можно свернуть и изменить размер
SWT.DIALOG_TRIM Окно имеет фиксированный размер

Окна Shell в интерфейсе могут быть представлены в «развернутом» (maximized), в «свернутом» (minimized) или в «нормальном» (normal) состоянии.

Если реализации Shell будет определено состояние «maximized», то window manager развернет окно так, чтобы оно заняло всю видимую область экрана (display). В развернутом состоянии размер Shell не может быть изменен, даже если оно имеет стиль RESIZE. Если Shell находится в нормальном состоянии, то внешний вид окна контролируется стилями, которые были определены на этапе создания. Размер окна может быть изменен, если окно имеет соответствующий стиль. Если стиль окна «minimized», то интерфейс окна (клиентская область) не виден. В зависимости от window manager окно может быть «свернуто» в иконку или скрыто.

Основные методы Shell

МетодОписание
void addShellListener(ShellListener listener) Добавление слушателя в коллекцию слушателей окна, которые вызываются при возникновении соответствующих событий.
void close() Закрытие окна
void dispose() Освобождение сввязанных с окном ресурсов.
void open() Открытие окна и размещение его сверху над остальными на экране, передача фокуса в окно.
Rectangle getBounds() Получение размеров окна в виде параметров четырехугольника.
Point getLocation() Получение точки размещения окна на экране относительно родительского окна или относительно экрана, если родительское окно не определено.
boolean getMaximized() Функция возвращает true, если окно развернуто во весь экран, в противном случае false.
Point getMinimumSize() Функция возвращает минимальный размер окна в виде Point.
boolean getModified() Функция возвращает true, если окно модифицированно, в противном случае false.
Point getSize() Получение размера окна в виде Point.
ToolBar getToolBar() Получение панели инструментов окна.
void setMinimumSize(int width, int height) Процедура определения минимального размера окна согласно значением параметров.
void setMinimumSize(Point size) Процедура определения минимального размера окна согласно значению параметра.
void setModified(boolean modified) Процедура определения измененного состояния окна.
void setVisible(boolean visible) Процедура представления окна видимым, если аргумент true, и невидиммым в проивном случае.

Слушатель окна 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), используя соответствующий пункт меню.

Листинг примера ShellModifiedTest

import 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 Мб).

  Рейтинг@Mail.ru