2015-03-28 5 views
1

Я новичок в разработке Java Swing GUI. В какой-то пример кода, я вижу окно свинг показано с EventQueue.invokeLater():В чем разница между двумя способами отображения окна в Swing?

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      MainWindow window=new MainWindow(); 
      window.setDefaultCloseOperation(EXIT_ON_CLOSE); 
      window.setVisible(true);     
     } 
    }); 

    System.out.println("main exited"); 

} 

Но, как я пытался, я могу также показать окно без использования EventQueue.invokeLater():

public static void main(String[] args) { 

    MainWindow window=new MainWindow(); 
    window.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    window.setVisible(true);  

    System.out.println("main exited"); 

} 

Так какая разница? Когда следует использовать каждый метод?

+0

проверка http://stackoverflow.com/a/3541425/2240409 – dazito

+0

и http://stackoverflow.com/questions/6567870/what-does-swingutilities-invokelater-do – testinfected

ответ

4

При вызове кода из метода main() вы должны ВСЕГДА использовать EventQueue.invokeLater(), потому что все компоненты Swing должны быть созданы в потоке отправки событий (EDT).

Да, код будет работать 99,99% времени при создании простого графического интерфейса другим способом, но вы не хотите тратить время на отладку случайной ошибки, когда она не работает.

Для получения дополнительной информации о EDT прочтите раздел из руководства Swing по телефону Concurrency and Swing и почему компоненты Swing должны быть созданы на EDT.

Примечание. Код, выполненный из прослушивателя Swing, вызывается из EDT.

+1

как и большинство, если не все, рамки GUI вы всегда должны запускать графический интерфейс на своем EDT или эквивалент. – dazito

+0

@dwnz Действительно. Я использовал для кодирования WinForm, и есть аналогичная идея. – smwikipedia