# Rahmen bei jLabel



## LukeSkywalker (26. Sep 2010)

Hallo,
ich programmiere eigentlich seit geraumer Zeit in Java, komme aber schlichtweg nicht mit diesem Problem voran:

Ich habe ein jLabel, das einen normalen Rahmen besitzt. Klickt ein Benutzer nun auf einen Button, soll ZUERST der Rahmen eine grüne Farbe bekommen, und DANACH ein mp3-File (ca. 1,3sec) mittels jLayer abgespielt werden. Nachdem das Soundfile abgespielt wurde soll der Rahmen wieder auf seinen Standartwert zurückgesetzt werden.
Das Problem ist, dass zuerst der Sound abgespielt wird, und scheinbar erst danach der Rahmen seine Farbe bekommt. Da dieser aber beim Abruf einer Funktion wieder zurückgesetzt wird, ist nichts von dem Ereignis sichtbar.
Was ich nun will ist, dass zuerst der Rahmen seine Farbe bekommt, dann das mp3-File abgespielt wird (dh. soll der grüne Rahmen während des Abspielens sichtbar sein) und danach alles auf die Standartwerte zurückgesetzt wird. Die relevanten Codeabschnitte habe ich angehängt - was für eine triviale Sache mache ich falsch? Danke für evtl. Hilfestellungen!


```
// Nur die notwendigsten Codeabschnitte
private javax.swing.border.Border border = javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED);

public void loadNext() {
	jLabel1.setBorder(this.border);
}

public void playCorrSound() {
	// Hier der jLayer-code für das Abspielen der Sounddate
	// kein Thread verwendet
}

public void jButton1MouseClicked(java.awt.event.MouseEvent e) {
	jLabel1.setBorder(new LineBorder(Color.GREEN,2));
	playCorrSound();
	loadNext();
}
```


----------



## eRaaaa (26. Sep 2010)

Probier`s mal so:

```
jLabel1.setBorder(new LineBorder(Color.GREEN, 2));
				new Thread(new Runnable() {
					@Override
					public void run() {
						playCorrSound();
						SwingUtilities.invokeLater(new Runnable() {
							public void run() {
								loadNext();
							}
						});
					}
				}).start();
```


----------



## LukeSkywalker (26. Sep 2010)

Interessant, das funktioniert. Danke! Aber wie genau hat das jetzt funktioniert?


----------



## eRaaaa (26. Sep 2010)

Mhm,ich bin gerade etwas schreibfaul, du kannst dir mal
Lesson: Concurrency in Swing (The Java™ Tutorials > Creating a GUI With JFC/Swing)
und
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.25 AWT, Swing und die Threads
durchlesen

Kurzfassung: Es gibt einen Thread(EDT) der fürs Zeichnen usw. zuständig ist. Dieser Thread führt auch den Code in den Listenern aus. Wenn du nun eine lange Aktion in dem Listener ausführst, "blockierst" du quasi diesen Thread, weil er ja damit beschäftigt ist diese lange Aktion auszuführen. In der Zeit kann er dann auch nicht zeichnen(Border neuzeichnen z.B.), deshalb müssen lange Aktion in einen neuen Thread ausgelagert werden.(hier new Thread(new Runnable))
Da wiederum alle Änderungen(einige Ausnahmen) an der Oberfläche von dem anderen Thread(EDT) ausgeführt werden müssen, musst du den Code(loadNext()) in die "Ereignisschlange" des Threads einreihen(hier SwingUtilities)

da das jetzt nur etwas oberflächlich erklärt wurde, solltest du dir auf jeden Fall mal die zwei Links durchlesen


----------

