Java threads

Hi,
ich hab das Problem dass wenn ich eine wav datei abspiele mir die GUI einfriert. So dass ich nicht mehr die Möglichkeit habe das abspielen zu stoppen. Mir ist bewusst, dass ich das ganze mit einem Thread lösen könnte, aber das genaue wie bereitet mir noch probleme.
Die Methode die meinen Player aufruft sieht folgendermaßen aus

 if(label.equals("play")){

 player = new Player();
 player.start();
 }
 if (label.equals("stop")){

 player.playerStop();
 player = null;
 }

Die Klasse Player sieht so aus

public class Player extends Thread{

 private AudioInputStream in = null;
 private SourceDataLine line = null;

 public Player(){
 try{
 in = AudioSystem.getAudioInputStream(new 
 URL(MainFrame.path));
 }catch (Exception d){
 d.printStackTrace();
 }


 AudioFormat format = in.getFormat();
 DataLine.Info info = new 
 DataLine.Info(SourceDataLine.class,format);
 try {
 line = (SourceDataLine)AudioSystem.getLine(info);
 line.open(format);
 }catch (Exception e) {
 System.exit(-2);
 }
 }



 public void start(){
 int readBytes =0;
 byte[] data = new byte[10000];
 line.start();

 do{
 try {
 readBytes = in.read(data,0,data.length);
 }catch (Exception e){
 System.exit(-3);
 }
 if (readBytes!=-1) line.write(data, 0, readBytes);
 } while (readBytes != -1);
 //line.drain();
 }

 public void playerStop(){
 line.close();
 }


}

Wie kann ich es hinbekommen dass trotz spielen einer Datei, ich weiterhin auf andere Elemente in meiner GUI zugreifen kann.
Danke schon mal im Voraus.

Grüße
Nick

Moien

public class Player extends Thread{

public void start(){

Das ist falsch. Du must die Methode public void run() implementieren, nicht public void start(). Aufrufen must du aber weiterhin start().

start() erzeugt den neuen Thread und ruft dann selbstständig run() auf.

cu

Das ist falsch. Du must die Methode public void run()
implementieren, nicht public void start(). Aufrufen must du
aber weiterhin start().

start() erzeugt den neuen Thread und ruft dann selbstständig
run() auf.

cu

Danke erstmal, habs jetzt ausgebessert aber irgendwie besteht mein Problem immer noch. Die neue Thread Klasse sieht jetzt so aus

import java.net.URL;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

public class Player extends Thread{

 private AudioInputStream in = null;
 private SourceDataLine line = null;

 public Player(){
 System.out.println("thread start");

 try{
 in = AudioSystem.getAudioInputStream(new URL(MainFrame.path));
 }catch (Exception d){
 d.printStackTrace();
 }


 AudioFormat format = in.getFormat();
 DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);
 try {
 line = (SourceDataLine)AudioSystem.getLine(info);
 line.open(format);
 }catch (Exception e) {
 System.exit(-2);
 }
 startPlaying();
 }





 public void stopPlaying(){
 line.close();
 }

 public void run(){
 startPlaying();
 }

 public void startPlaying(){
 int readBytes =0;
 byte[] data = new byte[10000];
 line.start();
 super.start();

 do{
 try {
 readBytes = in.read(data,0,data.length);
 }catch (Exception e){
 System.exit(-3);
 }
 if (readBytes!=-1) line.write(data, 0, readBytes);
 } while (readBytes != -1);
 line.drain();
 }


}

Moien

Danke erstmal, habs jetzt ausgebessert aber irgendwie besteht
mein Problem immer noch.

du hast ein paar Methoden umbenannt, erzeugt aber immernoch keinerlei Threads.

}catch (Exception e) {
System.exit(-2);
}
startPlaying();
}

Das muss start() sein, nicht startPlaying(). Du rufst immernoch nicht die Methode Thread.start() auf.

cu

}catch (Exception e) {
System.exit(-2);
}
startPlaying();
}

Sorry hatte den Methodenaufruf schon rausgenommen. startpPlaying() hatte dort nichts zu suchen…
Die Methode Thread.start ruf ich doch in meiner Main auf siehe oben mit

 player = new Player();
 player.start();

Dabei müsste doch der Thread automatisch die run() methode aufrufen, oder nicht???

Und der rest sieht so aus, wie gehabt

public class Player extends Thread{

 private AudioInputStream in = null;
 private SourceDataLine line = null;

 public Player(){
 System.out.println("thread start");

 try{
 in = AudioSystem.getAudioInputStream(new 
 URL(MainFrame.path));
 }catch (Exception d){
 d.printStackTrace();
 }


 AudioFormat format = in.getFormat();
 DataLine.Info info = new 
 DataLine.Info(SourceDataLine.class,format);
 try {
 line = (SourceDataLine)AudioSystem.getLine(info);
 line.open(format);
 }catch (Exception e) {
 System.exit(-2);
 }



 }





 public void stopPlaying(){
 line.close();
 }

 public void run(){
 startPlaying();
 }

 public void startPlaying(){

 int readBytes =0;
 byte[] data = new byte[10000];
 line.start();
 super.start();

 do{
 try {
 readBytes = in.read(data,0,data.length);
 }catch (Exception e){
 System.exit(-3);
 }
 if (readBytes!=-1) line.write(data, 0, readBytes);
 } while (readBytes != -1);
 line.drain();
 }


}

Danke für deine Hilfe!!!

Achso ich bekomme folgende Fehlermeldung

Exception in thread „Thread-2“ java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at Player.startPlaying(Player.java:57)
at Player.run(Player.java:48)

Und meine Datei wird gar nicht erst abgespielt. Wenn ich den Methodenaufruf im Konstruktor habe, also startPlaying() dann spielt er sie natürlich ab. Aber das ist ja nicht Sinn und Zweck der Sache. Sondern die Datei soll nur in der run() Methode abgespielt werden. Ich kann keinen Fehler erkennen, das macht mich langsam wahnsinnig :smile:

Du hast in deiner startPlaying()-Method einen super-Aufruf zu start() drin (Zeile 57).

Exception in thread „Thread-2“
java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at Player.startPlaying(Player.java:57)
at Player.run(Player.java:48)

Du rufts damit nochmal start() am Thread auf. Dieser Aufruf ist illegal! Ich weiß nicht, was du damit machen wolltest, aber der Aufruf muss raus.

Gruß,
Chris

Danke das wars, ich wusste es muss ne Kleinigkeit sein.
Läuft wie geschmiert das ganze :wink:

lg
Nick