2016-02-03 2 views
2

У меня есть процесс, подтверждающий сообщения от JOptionPane. Этот процесс вызывается из SwingUtilities.invokeLater (runnable), который находится внутри Actionlistener для JMenuItem. Код для работоспособного это:JOptionPane не исчезает, пока не появится следующая JOptionPane

SwingUtilities.invokeLater(new Runnable(){ 
        public void run(){ 
         MyClass c=new MyClass(file) 
         try { 
          c.start(); 
         } catch (Exception e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         try { 
          this.finalize(); 
         } catch (Throwable e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       }); 

В MyClass есть этот метод:

private boolean userInput(){ 
    String message="yes or no?"; 
    JCheckBox checkbox = new JCheckBox("Do this for all."); 
    Object[] params={message,checkbox}; 
    int n=JOptionPane.showConfirmDialog(null,params,"message",JOptionPane.YES_NO_OPTION); 
    boolean answer=(n==JOptionPane.YES_OPTION)?true:false; 
    if(checkbox.isSelected()){ 
     nextQ=false; 
     nextA=answer; 
    } 
    return answer; 
} 

, которая называется много раз. Когда отображается сообщение JOptionPane, я нажимаю его кнопку (да/нет), но сообщение не исчезнет, ​​пока не отобразится следующее сообщение. Что может быть проблемой? Связано ли это с методом invokeLater?

+0

попытаться сделать reavlidate(); repaint() – CMPS

+2

Идея без вашего SSCCE/MCVE, короткая работа, компилируемая, это не какая-то особая задача, – mKorbel

+1

Опубликуйте [MCVE] (http://stackoverflow.com/help/mcve). Обязательно скопируйте код в новый проект * и убедитесь, что он компилируется и запускается, прежде чем публиковать его здесь. – user1803551

ответ

-1

Я нашел способ решить эту проблему. Мне пришлось создать новую тему внутри метода SwingUrtilities.invokeLater. Это новый код:

SwingUtilities.invokeLater(new Runnable(){ 
       public void run(){ 
        Thread t=new Thread(new Runnable(){ 
         MyClass c=new MyClass(file) 
         public void run(){ 
          c.start(); 
         } 
        }); 
        t.start();  
       } 
      }); 
+0

Плохое решение. Вы смешиваете потоки с EDT. – user1803551