Audioclip Unterbrechen

DBR89

Aktives Mitglied
Hi Leute,

ich habe einen kleinen Audio Player geschrieben, welcher nach klick auf einen Button ein Musikstück wiedergibt.

Nun möchte ich erreichen, dass bei erneutem klick auf den Button das Musikstück gestoppt wird. Da ich mehrere Buttons erzeuge, soll es immer nur möglich sein, ein Musikstück abzuspielen.

Folgenden Code habe ich schon geschrieben:

Java:
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JButton;
import java.awt.Rectangle;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.awt.Font;

public class MusicManager extends JFrame {
	
	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	/**
	 * This is the default constructor
	 */
	public MusicManager() {
		super();
		initialize();
		this.setVisible(true);
	}
	
	public JButton createButton(int nummer, String name, final String lied, int x, int y){
		JButton jButton1 = null; 
		if (jButton1 == null) {
			jButton1 = new JButton(nummer + "     " + name);
			jButton1.setBounds(new Rectangle(x, y, 190, 60));
			jButton1.setFont(new Font("Dialog", Font.BOLD, 14));
			jButton1.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
					
					File file = new File(lied);
						AudioClip sound;
						try {
							sound = Applet.newAudioClip(file.toURL());
							sound.play();
						} catch (MalformedURLException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
				}
			});
		}
		return jButton1;
	}
	
	private void initialize() {
		this.setSize(900, 600);
		this.setContentPane(getJContentPane());
		this.setTitle("MusicManager");
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(createButton(2, "Nik Wurth", "C:/untitled recording 1.wav", 20, 60), null);
			jContentPane.add(createButton(3, "Niklas Kudernak", "untitled recording 1.wav", 20, 160), null);
			jContentPane.add(createButton(4, "Jan Eidemüller", "untitled recording 1.wav", 20, 260), null);
			jContentPane.add(createButton(5, "Dennis Bork", "untitled recording 1.wav", 20, 360), null);
			jContentPane.add(createButton(6, "Frei", "untitled recording 1.wav", 230, 60), null);
			jContentPane.add(createButton(7, "Tim Patrzalek", "untitled recording 1.wav", 230, 160), null);
			jContentPane.add(createButton(8, "David Max", "untitled recording 1.wav", 230, 260), null);
			jContentPane.add(createButton(9, "Chris Rampelt", "untitled recording 1.wav", 230, 360), null);
			jContentPane.add(createButton(10, "Ricardo Posocco", "untitled recording 1.wav", 440, 60), null);
			jContentPane.add(createButton(11, "Lars Werkmann", "untitled recording 1.wav", 440, 160), null);
			jContentPane.add(createButton(15, "Marvin Gernandt", "untitled recording 1.wav", 440, 260), null);
			jContentPane.add(createButton(9, "Tim Rinschen", "untitled recording 1.wav", 440, 360), null);
			//jContentPane.add(getJButton7(), null);
		}
		return jContentPane;
	}

		

}  //  @jve:decl-index=0:visual-constraint="16,-5"

Für Hilfe wäre ich euch echt Dankbar!

Gruß
 

Hobelhai

Mitglied
Zuallererst würde ich mir eine boolean-Variable einrichten, etwa
[Java]private boolean playing = false;[/Java]
Auch der AudioClip sollte als Instanzvariable vorliegen..
[Java]private AudioClip sound;[/Java]
Vom Zustand dieser Variablen machst Du abhängig, was dein Button anstellen soll, etwa
[Java]public void actionPerformed(java.awt.event.ActionEvent e) {

File file = new File(lied);
if (!playing)
{
try {
sound = Applet.newAudioClip(file.toURL());
sound.play();
playing = true;
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
else
{
sound.stop();
playing = false;
}
}
});[/Java]
Auf diese Art und Weise kannst Du auch die Beschriftung auf dem Button ändern, es sollte ja dann "Stop" drauf stehen, wenn der Clip spielt.
 

DBR89

Aktives Mitglied
funktioniert soweit auch, nur gib es jetzt das Problem, dass auch wenn der Titel fertig gespielt ist ein weiterer Button gedrückt werden muss.

Kann ich das abgespielte Lied nicht überprüfen, ob es fertig ist?
 

Hobelhai

Mitglied
Schreibe Dir eine Klasse Player, welche Clip oder DataLine implementiert. Damit hast Du die Möglichkeit, Statusabfragen durchzuführen, bspw. mittels der Methode Player.isRunning().
Du solltest Dich deshalb ein wenig mit dem Paket javax.sound.sampled auseinandersetzen. Du solltest außerdem davon absehen, diesen Player in der actionPerformed-Methode zu initialisieren, so wie Du es jetzt machst:
Java:
File file = new File(lied);
sound = Applet.newAudioClip(file.toURL());
ist das sehr unelegant.
Schreibe Dir für sowas eine eigene Methode - deshalb hatte ich in meiner ersten Antwort deinen AudioClip schon zu einer Instanzvariablen erklärt.
 

Ähnliche Java Themen

Neue Themen


Oben