2013-09-24 16 views
5

Was ist der beste Weg, um eine Java Swing-Anwendung zu starten? Vielleicht gibt es einen anderen Weg, es zu tun.Best Practice zum Starten einer Swing-Anwendung

Ich möchte wissen, ob ich die SwingUtilities-Klasse verwenden muss, um die Anwendung zu starten (zweite Möglichkeit) oder nicht (erste Möglichkeit).

public class MyFrame extends JFrame { 

public void createAndShowGUI() { 
    this.setSize(300, 300); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    // add components and stuff 
    this.setVisible(true); 
} 

public static void main(String[] args) { 

    // First possibility 
    MyFrame mf = new MyFrame(); 
    mf.createAndShowGUI(); 

    // Secound possibility 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      MyFrame mf = new MyFrame(); 
      mf.createAndShowGUI(); 
     } 
    }); 
} 

}

Antwort

7

Nur der zweite Weg ist richtig. Swing-Komponenten müssen nur im Ereignisversand-Thread erstellt und aufgerufen werden. Siehe concurrency in swing. Das entsprechende Angebot:

Warum erstellt der ursprüngliche Thread nicht einfach die GUI selbst? Da fast der gesamte Code, der Swing-Komponenten erstellt oder mit diesen interagiert, auf dem Ereignis-Dispatch-Thread ausgeführt werden muss. Diese Einschränkung wird im nächsten Abschnitt weiter diskutiert.

Also ja, Sie müssen invokeLater() verwenden.

+0

Danke für Ihre Antwort. Der Link in Ihrer Antwort ist sehr hilfreich! – Charmin

+1

@Maik du bist willkommen. Das und der Rest des Swing-Tutorials sind in der Tat lesenswert. – kiheru