Can';t让.mp3停止使用JavaFX媒体播放器

Can';t让.mp3停止使用JavaFX媒体播放器,java,javafx,mp3,media-player,scenebuilder,Java,Javafx,Mp3,Media Player,Scenebuilder,所以我尝试使用javafx和scenebuilder制作一个自动存储塔应用程序。它有一个小键盘,我在其中将歌曲的编号键入标签,标签上的文本转换为int,并传递给track()方法,该方法从数组中选择一个曲目(数组是未来爱好者的占位符) play()方法可以很好地播放曲目。。。 控制器类的代码: import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.f

所以我尝试使用javafx和scenebuilder制作一个自动存储塔应用程序。它有一个小键盘,我在其中将歌曲的编号键入标签,标签上的文本转换为int,并传递给track()方法,该方法从数组中选择一个曲目(数组是未来爱好者的占位符) play()方法可以很好地播放曲目。。。 控制器类的代码:

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

public class MainController implements Initializable {

@Override
public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub

}

@FXML
private Label number;

public void zero(ActionEvent event){

    number.setText(number.getText() + "0");
}

public void one(ActionEvent event){

    number.setText(number.getText() + "1"); 
}

public void two(ActionEvent event){

    number.setText(number.getText() + "2");
}

public void three(ActionEvent event){

    number.setText(number.getText() + "3");
}

public void four(ActionEvent event){

    number.setText(number.getText() + "4"); 
}

public void five(ActionEvent event){

    number.setText(number.getText() + "5");     
}

public void six(ActionEvent event){

    number.setText(number.getText() + "6");     
}

public void seven(ActionEvent event){

    number.setText(number.getText() + "7"); 
}

public void eight(ActionEvent event){

    number.setText(number.getText() + "8");     
}

public void nine(ActionEvent event){

    number.setText(number.getText() + "9");
}

public void clear(){
    number.setText("");
}

public MediaPlayer track(){
        URL[] songs = new URL[]{
        getClass().getResource("/res/03. Eyes On Fire.mp3"),
        getClass().getResource("/res/05,Graveyard-Endless Night.mp3"),
        getClass().getResource("/res/10 Nas - It Ain't Hard To Tell.mp3")
};

 final Media media = new Media(songs[Integer.parseInt(number.getText())].toString());
 final MediaPlayer mediaplayer = new MediaPlayer(media);
 return mediaplayer;
}

public void play(){
    track().play();

}

public void stop(){
    track().stop();
}

}
提前感谢。

您的
track()
方法每次调用时都会创建一个新的
MediaPlayer
。因此,当您调用
stop()
时,您调用它的实例与调用
play()
的实例不同,并且调用
play()
的实例永远不会停止

您需要保留对“当前”MediaPlayer的引用。让
track()
(或者
selectTrack()
更新该引用,然后您可以在需要时对其调用
stop()
。类似于:

public class MainController {

    private MediaPlayer player ;

    // ...

    public void selectTrack() {
        URL[] songs = new URL[] { ... } ;
        final Media media = new Media(songs[Integer.parseInt(number.getText())].toString());
        this.player = new MediaPlayer(media);
    }

    public void play() {
        // stop current player:
        if (player != null) {
            player.stop();
        }
        selectTrack();
        player.play();
    }

    public void stop() {
        player.stop();
    }
}

现在没有时间给出完整的答案,但是您的
track()
方法每次调用它时都会创建一个新的
MediaPlayer
。因此,您在另一个
MediaPlayer
上调用了
play()
(因此,您调用的
play()
永远不会停止)谢谢,我不敢相信我没有想到这一点。但是,对于如何修复它,你有什么建议吗?如果我没有使用方法声明mediaplayer,我在尝试运行程序时会出错