Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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!
Java:
// 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();
}
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