Hallo,
Ich hab mit dem Tutorial von thomasbe (http://www.tutorials.de/forum/java-tutorials/330869-java-media-framework.html) jetzt einen Player zusammengebastelt mit schöner Oberfläche, Wiedergabeliste etc.
Momentan häng ich dabei noch an 2 Problemen und komm damit einfach nicht weiter, weil ich auch online nichts finde...
1. Steuerung über einen Slider
Das erste Problem ist, dass ich einen JSlider hab, welcher den Fortschritt des Songs repräsentiert. Zu dieser Umsetzung habe ich auch das Beispiel aus dem Tutorial verwendet und es entsprechend abgeändert.
Nun soll man aber über diesen Slider auch manuell den Fortschritt setzen können.
Allerdings startet er den Song jedes mal von vorne...
Relevanter Code:
Ansätze waren bisher: ChangeListener, was allerdings mit dem "nur" 100-millisekündlichen Update und dem daraus resultierenden ständigen Neu-Setzen der Zeit zu unerwünschten Problemen führt
Außerdem hab ich's mit einem MouseListener versucht, das sieht momentan so aus:
Letztendlich die Methode, in der die Zeit gesetzt werden soll:
Wie gesagt, springt er nun beim Klick immer auf 0 zurück.. Vielleicht steh ich auch nur auf der Leitung und hab bei der Berechnung was falsch gemacht oder derartiges.
Wenn jemand einen Tipp (gern auch mehrere) für mich hat, wäre ich sehr froh, diesen zu hören.
2. Automatisch nächsten Song abspielen
Nun soll der Player auch automatisch den nächsten Song abspielen können.
Hierfür überlege ich noch über den passenden Ansatz.
Da ich in der API nichts entsprechendes gelesen habe (außer vielleicht der Controller, welcher mir aber auch nicht geeignet erscheint), habe ich mir gedacht, dass es das simpelste wäre, einen Timer mitlaufen zu lassen, der dann am Songende den nächsten aufruft.
Gibt es da eine bessere Lösung bzw. gar eine Methode des JMF?
Ich bin für jegliche Hinweise, Tips etc. dankbar; Vielen Dank im Voraus!
Gruß,
Martin
Ich hab mit dem Tutorial von thomasbe (http://www.tutorials.de/forum/java-tutorials/330869-java-media-framework.html) jetzt einen Player zusammengebastelt mit schöner Oberfläche, Wiedergabeliste etc.
Momentan häng ich dabei noch an 2 Problemen und komm damit einfach nicht weiter, weil ich auch online nichts finde...
1. Steuerung über einen Slider
Das erste Problem ist, dass ich einen JSlider hab, welcher den Fortschritt des Songs repräsentiert. Zu dieser Umsetzung habe ich auch das Beispiel aus dem Tutorial verwendet und es entsprechend abgeändert.
Nun soll man aber über diesen Slider auch manuell den Fortschritt setzen können.
Allerdings startet er den Song jedes mal von vorne...
Relevanter Code:
Java:
public void play() {
if(player != null)
player.stop(); //sollte schon etwas laufen
try {
player = Manager.createRealizedPlayer(new File(songPfad).toURI().toURL()); //Player mit dem Pfad neu setzen
songLänge = (int) player.getDuration().getSeconds(); //Länge ermitteln
player.setMediaTime(pausiertZeit); //sollte vorher pausiert worden sein
player.start(); //setzen
stop = false; //ist ein in den Attributen definierter boolean
refresherThread = new Thread() { //Thread, der alle 100ms das refresherRunnable aufruft
{
setPriority(Thread.MIN_PRIORITY);
}
public void run() {
try {
while ((refresherRunnable != null) && (!stop) && (!isInterrupted())) {
SwingUtilities.invokeLater(refresherRunnable);
sleep(100);
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//Runnable Thread
refresherRunnable = new Runnable() { //Runnable, welches den fortschrittSlider sowie die beiden Slider aktualisiert
public void run() {
int fortschritt = (int)player.getMediaTime().getSeconds();
int position = (100*fortschritt)/songLänge; //Berechnung der Position auf dem Slider
fortschrittSlider.setValue(position); //Setzen
}
};
refresherThread.start(); //Thread starten
Ansätze waren bisher: ChangeListener, was allerdings mit dem "nur" 100-millisekündlichen Update und dem daraus resultierenden ständigen Neu-Setzen der Zeit zu unerwünschten Problemen führt
Außerdem hab ich's mit einem MouseListener versucht, das sieht momentan so aus:
Java:
fortschrittSlider = new JSlider(); //wurde auch schon mit private JSlider fortschrittSlider; in den Attributen definiert
fortschrittSlider.setValue(0);
fortschrittSlider.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent evt) {
stop=true; //refresherThread anhalten, da der Slider sonst jedes Mal neu bewegt wird
refresherThread.interrupt();
zeitSetzen(fortschrittSlider.getValue());
}
public void mouseClicked(MouseEvent evt) {
stop=true; //refresherThread anhalten, da der Slider sonst jedes Mal neu bewegt wird
refresherThread.interrupt();
zeitSetzen(fortschrittSlider.getValue());
}
});
Letztendlich die Methode, in der die Zeit gesetzt werden soll:
Java:
public void zeitSetzen(int wert) {
player.stop(); //anhalten
long zeit = songLänge * wert* 10; //Zeitberechnung (eigentlich wert/100), aber da Time die Millisekunden verlangt, *10
pausiertZeit = new Time(zeit); //new Time(Millisekunden)
play(); //wieder starten
}
Wie gesagt, springt er nun beim Klick immer auf 0 zurück.. Vielleicht steh ich auch nur auf der Leitung und hab bei der Berechnung was falsch gemacht oder derartiges.
Wenn jemand einen Tipp (gern auch mehrere) für mich hat, wäre ich sehr froh, diesen zu hören.
2. Automatisch nächsten Song abspielen
Nun soll der Player auch automatisch den nächsten Song abspielen können.
Hierfür überlege ich noch über den passenden Ansatz.
Da ich in der API nichts entsprechendes gelesen habe (außer vielleicht der Controller, welcher mir aber auch nicht geeignet erscheint), habe ich mir gedacht, dass es das simpelste wäre, einen Timer mitlaufen zu lassen, der dann am Songende den nächsten aufruft.
Gibt es da eine bessere Lösung bzw. gar eine Methode des JMF?
Ich bin für jegliche Hinweise, Tips etc. dankbar; Vielen Dank im Voraus!
Gruß,
Martin