2013-10-09 1 views
2

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

С этой целью я пытался использовать JDialog, как показано ниже:

JOptionPane pane = new JOptionPane("Error message", JOptionPane.INFORMATION_MESSAGE); 
    JDialog dialog = pane.createDialog("Error"); 
    dialog.addWindowListener(null); 
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    dialog.setVisible(true); 
    Application.takeScreenshot(); 
    dialog.setVisible(false); 

мне было интересно, если есть конкретный метод, чтобы закрыть его. Я посмотрел документацию, и я не могу ее найти. Я попытался найти соответствующий вопрос на SO, но не смог найти тот, который касается моей проблемы.

Интересно, есть ли способ получить дескриптор окна, а затем закрыть его с помощью этого или просто отправить событие «ЗАКРЫТЬ» или «Пресс_ок» в окно?

Редактировать: Мне кажется, что код полностью перестает работать, когда отображается сообщение, как если бы существовал Thread.sleep(), пока пользователь не закрыл окно вручную.

Если возможно, образец кода был бы полезен.

Благодаря

+0

Пожалуйста, взгляните на этот замечательный [ответ] (http://stackoverflow.com/q/18105598/1057230), который, безусловно, делает его работу намного лучше :-) –

ответ

2

Попробуйте использовать ScheduledExecutorService. Что-то вроде:

JDialog dialog = pane.createDialog("Error"); 
    dialog.addWindowListener(null); 
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 

ScheduledExecutorService sch = Executors.newSingleThreadScheduledExecutor();  
sch.schedule(new Runnable() { 
    public void run() { 
     dialog.setVisible(false); 
     dialog.dispose(); 
    } 
}, 10, TimeUnit.SECONDS); 

dialog.setVisible(true); 

[EDIT]

С уважением к camickr комментария, документация не говоря уже о том, что ScheduledExedcutorService выполняется на событие диспетчерской темы. Поэтому лучше использовать swing.Timer

JDialog dialog = pane.createDialog("Error"); 
dialog.addWindowListener(null); 
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 

Timer timer = new Timer(10000, new ActionListener() { // 10 sec 
      public void actionPerformed(ActionEvent e) { 
       dialog.setVisible(false); 
       dialog.dispose(); 
      } 
     }); 

     timer.start(); 

     dialog.setVisible(true); 
+0

может быть с побочными эффектами в Java7 для более длительной задержки, затем dialog.whatever будет вызван из EDT – mKorbel

+0

Хороший намек, я никогда не использовал более 20 секунд, есть doc. Справка? –

+0

http://docs.oracle.com/javase/7/docs/api/java/awt/Dialog.html#setModalityType%28java.awt.Dialog.ModalityType%29 – user2863138

1

Мне удалось это исправить. По-видимому, по умолчанию JDialog является модальным, что означает, что он прерывает все остальное, пока пользователь не закрыт. Чтобы это исправить, я использовал метод:

dialog.setModalityType(Dialog.ModalityType.MODELESS); 

Когда активен, простой .setVisible (ложь); достаточно. В любом случае спасибо за помощь, извините за создание ненужного вопроса, но я был у него часами, пока не нашел его. Надеюсь, это поможет другим.

+0

Установка 'JDialog' в false недостаточно, так как она все равно останется. Устранение этого - это путь. Более того, пример, приведенный в приведенной выше ссылке, не связан с тем, является ли «JDialog» модальным или нет. –

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

  • Нет связанных вопросов^_^