Thread beenden!

Status
Nicht offen für weitere Antworten.

Beebop

Mitglied
Hi,

ich habe einen Music Player gebaut, der wavs abspielt (nicht alle). Der JSlider ist momentan nur Deko.

Mein Problem ist, das in meinem Menü das Stopp-MenuItem nicht funktioniert, ich kann ein wav-file auswählen und über play abspielen, aber stopp will ums verrecken nicht funtionieren, ich hab schon so viel versucht, momentan geht das ganze für ne sekunde aus, mit Fehlermeldungen in Eclipse.

Angehängt habe ich zwei Klassen, die eine kümmert sich um die Menüs, die andere ums abspielen.
In der Zeile 140 so ist die if-Anweisung die den Thread abbrechen soll, ich würde mich sehr freuen wenn mich jemand mit ein wenig Code, Ideen unterstützen könnte.

Code:
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.applet.AudioClip;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.*;
import java.awt.*;
import java.io.File;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Player1 extends JFrame implements ActionListener {
	
	private JPanel grafikPanel;
	private JPanel unten;
	private JMenuItem opennow;		
	private JMenuItem quit;	
	private JMenuItem play;
	private JMenuItem stopthread;
	private JFileChooser fileChooser;
	private JSlider laut;
	private JTextArea info;
	private float gain; 
	private String neuezeile = "\n";
	private Object source;
	
	
	
	Player1() {

		//Konstruktor der Klasse
		super();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container content = getContentPane();
		
		this.setTitle("JavaAmp");
		
		JMenuBar menueLeiste = new JMenuBar();
		JMenu menuDatei = new JMenu("File");
		menuDatei.setMnemonic('F');
		
		info = new JTextArea();
		JScrollPane infolog = new JScrollPane(info);
		
				
		grafikPanel = new JPanel();
		add(infolog,BorderLayout.CENTER);
		
		unten = new JPanel();
		add(unten,BorderLayout.SOUTH);
		
		laut = new JSlider(0,100,0);
		
		JPanel unten1 = new JPanel();
		unten1.setLayout(new GridLayout(3,1));
		unten.add(unten1, BorderLayout.CENTER);
		
		unten1.add(laut);
			    	    
	    fileChooser = new JFileChooser();
	    //Hiermit werden nur noch wav files geladen
	    FileNameExtensionFilter filter = new FileNameExtensionFilter("Soundformate wav","wav");
	    fileChooser.setAcceptAllFileFilterUsed(false);
	    fileChooser.addChoosableFileFilter(filter);
		
	    // Einzelne Menu Items

	    opennow = new JMenuItem("Oeffnen",KeyEvent.VK_O );
		quit = new JMenuItem ("Programm Beenden", KeyEvent.VK_P);
		stopthread = new JMenuItem("Stop",KeyEvent.VK_S);
		play = new JMenuItem("Play",KeyEvent.VK_Y);
		
		opennow.addActionListener(new MenuAktion00());
		quit.addActionListener(new MenuAktion01());
		play.addActionListener(this);
		stopthread.addActionListener(this);

		menuDatei.add(opennow);
		menuDatei.add(play);
		menuDatei.add(stopthread);
		menuDatei.add(quit);
		
		// Menuleiste

		menueLeiste.add(menuDatei);
		this.setJMenuBar(menueLeiste);
				
	}
	
	private class MenuAktion00 implements ActionListener{
		public void actionPerformed(ActionEvent e){
			 if (e.getSource() == opennow) {
				 
				 int returnVal = fileChooser.showOpenDialog(Player1.this);
		            
		            if (returnVal == JFileChooser.APPROVE_OPTION) {
		                File file = fileChooser.getSelectedFile();
		                info.append("Geoeffnet: " + file.getName() + "." + neuezeile);
		            } else {
		                info.append("Oeffnen abgebrochen." + neuezeile);
		            }
		            info.setCaretPosition(info.getDocument().getLength());

		     }
		}
	}	
	
	private class MenuAktion01 implements ActionListener{
		public void actionPerformed(ActionEvent e){
		
			if(e.getSource() == quit){
				System.exit(0);
			}
		}
	}
		
	public void actionPerformed(ActionEvent event) {
		
		Object source = event.getSource();
		File soundFile = fileChooser.getSelectedFile();		
	    
		if (source == play) {
	    		    	    
		    PlayerThread sound = new PlayerThread(soundFile);
		    Thread go = new Thread(sound);	
	    				
			go.start();
			
			
	    } 
	
	    if (source == stopthread) {

	    	//HIER SOLL DER THREAD BEENDET WERDEN !
	    	
               Thread go = new Thread((Runnable) soundFile);	
	    	
	    
	    	go.stop();
	    				
	    	//	!!!
	    }
	}

		public static void main(String[] args) {

		Player1 fenster = new Player1();
		fenster.setSize(300, 200);
		fenster.setVisible(true);
	}
}


Code:
import java.io.File;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.SourceDataLine;
import javax.swing.JOptionPane;

public class PlayerThread implements Runnable{
	  
	private File file;
	
	public PlayerThread(File file){
		this.file = file;
	}
		
	public void run(){
		
		play(this.file);
			
	}
	
	public void play(File file){
		
		AudioInputStream audioInputStream;
		byte[] buffer = new byte[4096];
		try {
			audioInputStream = AudioSystem.getAudioInputStream(file);
			AudioFormat audioFormat = audioInputStream.getFormat();
			SourceDataLine sourceDataLine = AudioSystem.getSourceDataLine(audioFormat);
			sourceDataLine.open(audioFormat, buffer.length);
			sourceDataLine.start();
			while(true) {
				int numBytes = audioInputStream.read(buffer);
				if (numBytes <= 0)
					break;
				sourceDataLine.write(buffer, 0, numBytes);
			} 
			sourceDataLine.drain();
			sourceDataLine.stop();
			} catch (Exception e) {
				
			}
		}
	}
 
du erstellst auch ein neuen thread und willst den stoppen.
das bringt ja auch nix. du musst den als klassenvariable speichern und den dann stoppen.

zudem ist stop() Deprecated. man sollte interrupt() benutzen.
 
Ok, das ich mit
Code:
Thread go = new Thread((Runnable) soundFile);
einen neuen Thread öffne und damit nicht auf den alten zugreife, der bei "play" definiert ist, bzw. schliessen kann, leuchtet mir ein.

Muss ich jetzt den den Thread bei "play" (Zeile127) als Klassenvariable speichern ?
 
Ich hab keine Ahnung wie man einen Thread, als Klassenvariable die speichert, erstellen kann. Habs mal so versucht, hat aber nichts gebracht.

Code:
static Thread go = new Thread();

Und bevor jetzt auf mich eingeschlagen wird, möchte ich bitte, das berücksichtigt wird, das dass hier das Anfängerfragen-Forum ist, und meine Java Kenntnisse eben noch nicht so gefestigt sind, Danke.
 
du musst nichts großartig ändern
Code:
private Thread t;


und in deinem actionPerformed()

t= new Thread(....)


und in Zeile 140 dann

t.interrupted()
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben