2013-11-22 1 views
2

У меня возникла проблема с пользовательским JDialog, который создается в своей собственной теме основным фреймом.JDialog не отображается

Иногда JDialog является невидимым, но его контрольные точки являются интерактивными (если вы знаете, где их позиция). Проблема не возникает в Oracle Java 1.7, но определенно на Oracle Java 1.6 (см. 1.6.0_37 и 1.6.0_45).

Я создаю подобный диалог:

class MyDialog extends Jdialog() { 
public MyDialog(JFrame frame, boolean modal) { 
    super(frame, modal); 
    [...] 
    } 
} 

В моих мейнфреймах:

MyDialog dialog = new MyDialog(myMainFrame,true); 
dialog.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL); 
dialog.setVisible(true); 

Ожидаемое поведение блокировать события, как MouseEvents мэйнфреймов и лежит над ним. Это отлично работает на Java 1.7.

Итак, мой вопрос в том, есть ли какие-либо особые вещи, которые следует иметь в виду при создании JDialogs, как создать его только после того, как будет отображаться родительский кадр (владелец) или это может быть известная ошибка используемой Java JRE? Я уже проверил в журнале исправлений ошибок Oracle here без успеха.

+6

Невозможно называть 'repaint()' или 'revalidate', как предлагает @subash. Ваша проблема звучит прерывисто, что для меня пахнет проблемой свинг-резьбы. Вы заботитесь, чтобы все свинг-звонки на EDT? И назвать длинный код с EDT? Лучше всего было бы, если бы вы могли опубликовать короткий код, который компилирует, запускает и воспроизводит вашу проблему здесь, [sscce] (http://sscce.org). –

+0

Вы правы, SSCCE будет лучше, но моя проблема принимает участие в проекте с большим кодом, поэтому sccce, к сожалению, не воспроизведет мою проблему. Я думаю, что подсказка @Durandal приводит меня в правильном направлении, потому что это, похоже, проблема с потоками. Это объясняет, почему это происходит не всегда, а только иногда. Проблема JAVA 1.6/1.7 может быть связана с другим дизайном. Спасибо за вашу помощь! – alex

ответ

2

«У меня есть проблема с обычаем JDialog, , который создается в отдельном потоке на основной раме»

Если то в буквальном смысле, что проблемы.

Нельзя создавать экземпляры объектов Swing, особенно JComponent в любой другой теме, кроме Thread Dispatch Thread. Swing не является полностью потокобезопасным, используйте SwingUtilities.invokeAndWait()/invokeLater() для выполнения кода, связанного с GUI, когда вы не совсем уверены, что находитесь на EDT.