Ich habe das Problem beim programmieren meines Musicplayers mit JavaFX, dass wenn ich ein File mit dem FileChooser wähle und abspiele und nicht anhalte, und danach wieder mit dem FileChooser ein neues File auswähle, es beide Files gleichzeitig abspielt, ohne dass das erste stoppt. Wie kann ich das Abspielen der vorherigen Datei stoppen und damit das gleichzeitige Spielen beider Dateien?
Maincontroller:
Maincontroller:
Code:
package application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import java.io.File;
import java.net.URL;
import javafx.util.Duration;
import java.util.ResourceBundle;
import javafx.scene.input.MouseEvent;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.FileChooser;
public class MainController implements Initializable {
@FXML
private MediaPlayer mp;
@FXML
private Slider volumeSlider;
@FXML
private String filePath;
@FXML
private Slider seekSlider;
@FXML
private Label timeLabel;
@FXML
private Duration duration;
@FXML
private Label songName;
@FXML
private void handleButtonAction (ActionEvent event)
{
FileChooser fileChooser = new FileChooser();
FileChooser.ExtensionFilter filter = new FileChooser.ExtensionFilter("Wähle eine Datei (*.mp3)", "*.mp3");
fileChooser.getExtensionFilters().add(filter);
File file = fileChooser.showOpenDialog(null);
filePath = file.toURI().toString();
if(filePath != null)
{
Media media = new Media(filePath);
mp = new MediaPlayer(media);
mp.play();
volumeSlider.valueProperty().addListener(new InvalidationListener()
{
@Override
public void invalidated(Observable observable)
{
mp.setVolume(volumeSlider.getValue() / 100);
}
});
seekSlider.valueProperty().addListener(new InvalidationListener() {
public void invalidated(Observable ov) {
if (seekSlider.isValueChanging()) {
mp.seek(duration.multiply(seekSlider.getValue() / 100.0));
}
}
});
String fileName = file.getName();
songName.setText("Track: " + fileName);
mp.currentTimeProperty().addListener(new InvalidationListener() {
public void invalidated(Observable ov)
{
updateValues();
}
});
mp.setOnReady(new Runnable() {
public void run() {
duration = mp.getMedia().getDuration();
updateValues();
}
});
}
}
@FXML
protected void updateValues() {
if (timeLabel != null && seekSlider != null && volumeSlider != null) {
Platform.runLater(new Runnable() {
@SuppressWarnings("deprecation")
public void run() {
Duration currentTime = mp.getCurrentTime();
timeLabel.setText(formatTime(currentTime, duration));
seekSlider.setDisable(duration.isUnknown());
if (!seekSlider.isDisabled()
&& duration.greaterThan(Duration.ZERO)
&& !seekSlider.isValueChanging()) {
seekSlider.setValue(currentTime.divide(duration).toMillis()
* 100.0);
}
if (!volumeSlider.isValueChanging()) {
volumeSlider.setValue((int)Math.round(mp.getVolume()
* 100));
}
}
});
}
}
private static String formatTime(Duration elapsed, Duration duration) {
int intElapsed = (int)Math.floor(elapsed.toSeconds());
int elapsedHours = intElapsed / (60 * 60);
if (elapsedHours > 0) {
intElapsed -= elapsedHours * 60 * 60;
}
int elapsedMinutes = intElapsed / 60;
int elapsedSeconds = intElapsed - elapsedHours * 60 * 60
- elapsedMinutes * 60;
if (duration.greaterThan(Duration.ZERO)) {
int intDuration = (int)Math.floor(duration.toSeconds());
int durationHours = intDuration / (60 * 60);
if (durationHours > 0) {
intDuration -= durationHours * 60 * 60;
}
int durationMinutes = intDuration / 60;
int durationSeconds = intDuration - durationHours * 60 * 60 -
durationMinutes * 60;
if (durationHours > 0) {
return String.format("%d:%02d:%02d/%d:%02d:%02d",
elapsedHours, elapsedMinutes, elapsedSeconds,
durationHours, durationMinutes, durationSeconds);
} else {
return String.format("%02d:%02d/%02d:%02d",
elapsedMinutes, elapsedSeconds,durationMinutes,
durationSeconds);
}
} else {
if (elapsedHours > 0) {
return String.format("%d:%02d:%02d", elapsedHours,
elapsedMinutes, elapsedSeconds);
} else {
return String.format("%02d:%02d",elapsedMinutes,
elapsedSeconds);
}
}
}
@FXML
public void play(ActionEvent event)
{
mp.play();
mp.setRate(1);
}
@FXML
public void pause(ActionEvent event)
{
mp.pause();
}
@FXML
public void stop(ActionEvent event)
{
mp.stop();
}
@FXML
public void slow(ActionEvent event)
{
mp.setRate(0.5);
}
@FXML
public void fast(ActionEvent event)
{
mp.setRate(2);
}
@FXML
public void reload(ActionEvent event)
{
mp.seek(mp.getStartTime());
mp.play();
}
@FXML
public void next(ActionEvent event)
{
mp.seek(mp.getTotalDuration());
mp.play();
}
public void mute(ActionEvent event)
{
if (mp.isMute())
{
mp.setMute(false);
}
else
{
mp.setMute(true);
}
}
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
}
}