У меня есть настольное приложение 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.