Создание пользовательского модального диалога для апплета / приложения Swing - PullRequest
2 голосов
/ 15 июля 2010

Я пишу приложение Swing, которое должно функционировать либо как апплет в браузере, либо как отдельное приложение, то есть оно может содержаться либо в JFrame, либо в JApplet.

В этом контексте я бы хотел отобразить пользовательское модальное диалоговое окно для пользователя (то есть сложное диалоговое окно с пользовательским макетом и логикой, а не просто одно из простых приглашений JOptionPane). Хорошо, если диалог представляет собой легкий компонент, полностью содержащийся в окне приложения.

В то же время в приложении будет происходить фоновая обработка (сетевые потоки, анимация и т. Д.). Это необходимо продолжить, пока отображается диалоговое окно.

Каков наилучший подход для реализации этого?

Ответы [ 2 ]

4 голосов
/ 15 июля 2010

Взгляните на JDialog.Если вы установите его модальным, он будет запускать свою собственную обработку событий, чтобы поддерживать актуальность графического интерфейса, в то же время захватывая события мыши и клавиатуры для собственного использования.

Я посмотрел на код, который он использует, и на самом деле это не так.что-то, что вы хотите попробовать изобрести заново.

Если вы запустите его немодально, вам, вероятно, потребуется добавить слушатель, который будет вызван, когда он наконец закроется.Это делается с помощью addWindowListener и WindowAdapter, который переопределяет windowClosing.

Что касается параметра owner для конструктора, я использую

    Window w = (Window) SwingUtilities.getAncestorOfClass(Window.class, comp);

, где comp - это некоторый видимый компонент.

Это работает, потому что всегда есть окно верхнего уровня, независимо от того, работает ли оно как апплет или приложение.

1 голос
/ 07 ноября 2011

Здесь описан интересный способ показа фреймов как модальных указанному владельцу: Показывать данный фрейм как модальный указанному владельцу

Однако метод start() класса EventPump следует изменить следующим образом:

protected void start() throws Exception
{
    Class<?> cl = Class.forName("java.awt.Conditional");
    Object conditional = Proxy.newProxyInstance(cl.getClassLoader(), new Class[] { cl }, this);

    ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
    String name = Thread.currentThread().getName();
    EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();

    Constructor constructor = Class.forName("java.awt.EventDispatchThread").
            getDeclaredConstructor(ThreadGroup.class, name.getClass(), eventQueue.getClass());
    constructor.setAccessible(true);
    Object eventDispatchThread = constructor.newInstance(threadGroup, name, eventQueue);

    Method pumpMethod = eventDispatchThread.getClass().getDeclaredMethod("pumpEvents", cl);
    pumpMethod.setAccessible(true);
    pumpMethod.invoke(eventDispatchThread, conditional);
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...