Neues Fenster mit oder ohne "new Runnable()"?

DarthShader

Erfahrenes Mitglied
Hallo,

ich würde gerne wissen, worin bei den folgenden beiden Codeblöcken der Unterschied besteht:

Java:
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
	public void run()
	{
		JFrame frame = new JFrame( "Test" );
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.setSize( 700, 550 );
		frame.setLocationRelativeTo( null );
		frame.setVisible(true);
	}
});

Java:
JFrame frame = new JFrame( "Test" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setSize( 700, 550 );
frame.setLocationRelativeTo( null );
frame.setVisible(true);

Beim ersten block wird ein neues Runable erzeugt und in dessen Run Methode das Fenster erstellt. Im zweiten Block habe ich dies einfach weggelassen.

Beide Codeblöcke erzeugen dasselbe Fenster, die Applikation wird auch beim Schliessen des Fensters beendet.

Wozu ist also diese Sache mit dem Runable? Benötigt man das wirklich, oder ist es mehr guter Stil? Was gäbe es für Nachteile ohne das Runable?


Vielen Dank für Eure Hilfe!
 
Hallo,

soweit ich weiß ist Runnable Threadtechnik. Dh. dein Fenster läuft in nem eigenen Thread (bürgerlich gesagt "Unterprozess"). Das macht zB. Sinn wenn deine GUI etwas tun soll obwohl der Prozess an sich gerade schwer beschäfftigt ist mit zB Dateisuche. Würdest du das nicht mit Threadtechnik machen, wäre dein einer Thread voll ausgelastet mit Dateien suchen. Und ein zB LabeBalken, den du wärend der Suche laufen lassen möchtest, würde sich wärden der Suche nicht verändern. Erst wenn der Thread nicht mehr voll ausgelastet ist würde sich der LadeBalken neu zeichnen.
 
Danke für die Antwort. Ja das stimmt mit dem Thread, ich dachte nur bei der Variante ohne dem Runnable würde von Swing automatisch ein Read- and -Dispatch Thread erstellt.

Nunja, ich werd das mit Runnable machen, es wird sicher so sein, dass die Anwendung (die GUI) dann evtl. "gefreezt" wird.
 
Ich habe es eben nochmal ausprobiert - also zusammenfassend:
1. JFrame erstellt wie oben, jedoch ohne "invokeLater"
2. Im Programm eine unendliche while Schleife mit "Thread.sleep( 2000 )" und einer Ausgabe, die also dann alle 2 Sek. erscheint.

Folge: das Programm/die GUI friert _nicht_ ein! Also muss das erstellen eines neuen JFrame ja zur Folge haben, dass automatisch ein neuer event-dispatching-thread erstellt wird?! Wozu dann die Sache mit dem "invokeLater" und "new Runnable"?

Kann jemand mehr dazu sagen?
 
Naja, dein Beispiel hinkt ein bischen, da dein Sleep bzw. die Ausgabe nicht wirklich auf die Performance drücken.
Ich hatte vor kurzem ein ähnliches Problem, bei dem wirklich (wie von RealHAZZARD angesprochen) eine Dateisuche via COM lief.

Ohne die swingUtillities hatte ich in meiner GUI immer wieder aussetzer bzw meine JProgressBar wurde nicht sauber aktualisiert. Nachdem ich die SwingUtillities nutzte, lief die Sache sauber.
 
Zurück