2015-07-26 2 views
1

Я хочу, чтобы JOptionPane не имеет кнопок и не может быть закрыт пользователем для отображения в центре экрана относительно другого компонента. Затем я хочу выполнить другой код, после чего я закрою JOptionPane.Java - Закрытие JOptionPane после завершения задачи

Вот что у меня есть:

JOptionPane uploadPane = new JOptionPane("Uploading data...", JOptionPane.INFORMATION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, new Object[]{}, null); 
JDialog dialog = new JDialog(); 
dialog.setTitle("Uploading"); 
dialog.setModal(true); 
dialog.setContentPane(uploadPane); 
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
dialog.pack(); 
dialog.setVisible(true); 
dialog.setLocationRelativeTo(this); 

// TODO: Upload data 

dialog.dispose(); 

Этот код создает JOptionPane в верхнем левом углу экрана, который появляется, как я хочу, чтобы появиться (в сторону от его местоположения). Однако он не закрывается.

Когда я избавляюсь от линии:

dialog.setModal(true); 

JOptionPane создается в том месте, что оно должно быть, и делает ближе по команде Dispose. Однако по какой-то причине он ничего не говорит об этом. От названия нет сообщения или значка.

Как я могу заставить это работать?

+0

Возможно, вы заблокируете Диспетчерскую тему. Посмотрите на [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) и [Создание графического интерфейса с JFC/Swing] (http://docs.oracle.com/ javase/tutorial/uiswing /) – MadProgrammer

+0

Как происходит то, что EDT блокируется? – Infamous911

+0

Вы можете блокировать EDT, выполняя длительный процесс или вызывая метод блокировки или Thread.sleep, например – MadProgrammer

ответ

0

Check this SO post.

Если вы установили модель в true в JDialog, выполнение остановится, как только JDialog будет отображаться, и выполнение будет ждать, пока диалог не будет закрыт.

Но в вашем коде вы указали dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);.

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

Это означает, что,

dialog.setLocationRelativeTo(this); 

и любые последующие строки не выполняются вообще.

+0

Хорошо, есть ли способ показать UploadPane в диалоге без приостановки выполнения? – Infamous911

+0

Вам нужно удалить 'setModel (true)', но если это не отображает контент, то это, вероятно, потому, что вы заблокировали EDT, как упомянул MadProgrammer. Ваш код, как сейчас, недостаточно, чтобы сказать наверняка. – Codebender

+0

Хм, как точно блокировать EDT? Вы правы, код работает, когда я просто создаю новый класс и проверяю его там. Я не знаю, что я делаю в классе, который может вызвать это. Я использую invokeLater один раз, чтобы запустить все, и избавление от этого ничего не меняет. – Infamous911

Смежные вопросы