Проблема рендеринга с приложением Swing и модальными диалогами - PullRequest
1 голос
/ 15 сентября 2010

У меня есть настольное приложение Java / Swing (Java 6u16 в Windows XP), которое иногда кажется пользователям зависшим.Я говорю, кажется, потому что в действительности происходит то, что приложение показывает модальное диалоговое окно, но это диалоговое окно не отображается.Если пользователь использует Alt-Tab для переключения с приложения, а затем возвращается к нему, диалоговое окно отображается правильно.Кроме того, если удаленный пользователь подключается к сеансу через NetOp (рабочий аналог VNC / Remote Desktop), это также приводит к корректной перерисовке графического интерфейса пользователя.

Приложение работает через JavaWebstart.Поскольку я слышал о проблемах рендеринга, вызванных DirectDraw, я добавил следующее в JNLP

<property name="sun.java2d.noddraw" value="true"/>

, но проблема все еще возникает (если я правильно понял, это полностью отключит DirectDraw и Direct3d:см. http://download.oracle.com/javase/1.5.0/docs/guide/2d/flags.html#noddraw)

У меня нет идей по этому вопросу, любые предложения будут с благодарностью.

Спасибо,
Фил

Edit ...

У меня есть абстрактный класс диалога, который расширяет JDialog и который расширяют все другие диалоги. Он содержит следующий метод:

public void showDialog() {      
    initKeyBindings();
    Application.getApplication().deactivateScannerListener();
    setVisible(true);
}

Всякий раз, когда яЧтобы отобразить диалоговое окно, я вызываю функцию showDialog (). Метод initKeyBindings устанавливает ActionMap, в то время как вторая строка зависит от приложения (приложение является одноэлементным, я отключаю прослушиватель сканера JPOS во время отображения диалогового окна).

Существует соответствующий метод hideDialog () следующим образом:

public void hideDialog() {      
    setVisible(false);
    Application.getApplication().activateScannerListener();
    dispose();
}

Спасибо, Фил

Редактировать ... Извините заэто, еще одно редактирование:У всех диалогов есть родитель.Класс AbstractDialog по умолчанию будет основным фреймом приложения, если не указан другой родительский элемент.

FYI. Для всех, кто после этого добавил в свой код следующее:

if (SwingUtilities.isEventDispatchThread()) {
        initialiseAndShowDialog();
} else {
    SwingUtilities.invokeAndWait(new Runnable() {
            @Override
            public void run() {
               initialiseAndShowDialog();
            }
    });
}

Это гарантируетчто диалог открывается только из EDT.

1 Ответ

2 голосов
/ 15 сентября 2010

Из какого потока вы звоните showDialog () из?Доступ к компонентам Swing возможен только в потоке диспетчеризации событий.

Вы можете попробовать SwingUtilities.invokeAndWait () , а переданный ему аргумент Runnable должен вызвать showDialog ().

Сообщите нам, если это решило проблему.

...