2013-07-16 6 views
3

У меня есть один простой вопрос: почему мне нужно писать код, как это сКачели GUI одна простая вещь

SwingUtilities.invokeLater(new Runnable(){ 

Если программа создать одну рамку без него?

код с SwingUtilities

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 


public class App { 
    public static void main (String args[]){  
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JFrame frame = new JFrame("Hello world swing"); 
       frame.setVisible(true); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setSize(300, 400);   
      } 
     }); 
    } 
} 

код без распашных коммунальных услуг.

import javax.swing.JFrame; 

public class App { 
    public static void main (String args[]){  
     JFrame frame = new JFrame("Hello world swing"); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(300, 400); 
    } 
} 
+2

Я думаю, [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/), может объяснить эту вещь намного лучше :-) –

+0

В следующий раз используйте лучший заголовок для вашего вопроса. У меня был тот же вопрос, но я не нашел ваш вопрос из-за плохого названия ;-) Вот мой вопрос: http://stackoverflow.com/questions/18976990/best-practice-to-start-a-swing -application – Charmin

ответ

4

Свинг не является потокобезопасным и однопоточным. Он использует тему Dispatch Event (EDT) для создания, обновления и рендеринга своих компонентов.

См http://en.wikipedia.org/wiki/Event_dispatching_thread

SwingUtilities.invokeLater и SwingUtilities.invokeAndWait методы подсобные в основном положить ваши Свинг связанные задачи в EDT.

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

Связанные с GUI (SWING) операции по EDT.

Также большинство графических интерфейсов являются однопоточными. Так что это Свинг. Поэтому, пытаясь использовать , доступ к Swing из более чем одного потока увеличит риск сбоя приложения. Прочитайте эту http://codeidol.com/java/java-concurrency/GUI-Applications/Why-are-GUIs-Single-threaded/

В вашем коде, качелей Операция (создание JFrame) делается на основном потоке, что не рекомендуется. Используйте SwingUtilities.invokeLater().

+2

Насколько мне известно, то же самое происходит для всех «графических интерфейсов», независимо от того, используете ли вы «.NET/Swing», все они работают на своих соответствующих «EDT's». +1 к информации :-) –

+0

@nIcEcOw +1 для этого. да. Я обновил свой ответ – veritas

+0

@veritas спасибо за информацию, я постараюсь узнать все об этих потоках. –