Java 不同实例中的 MusicPlay

Java MusicPlay in different Instance

我有一个带有 MusicPlayer 的 Main Class。它播放音乐。现在我需要在另一个 class.

中停止并播放音乐
public class Main{

    public final Media musicMedia = new Media(new File("music.mp3").toURI().toString());
    public final MediaPlayer mediaPlayer = new MediaPlayer(musicMedia );

    public static void main(String[] args){
    }

}

所以现在,我想要这样:如果音乐正在播放并且我单击按钮,音乐应该停止播放。如果它不播放音乐而我按下按钮,它应该会开始播放音乐。希望您能理解我的问题。

public class AnotherClass{

    Main mp3 = new Main();
    boolean clicked = true;

    public void musicButtonClicked(ActionEvent e){
        if(clicked){
            mp3.mediaPlayer.stop();  //Stop doesn't work!
            clicked = false;
        }else{
            mp3.mediaPlayer.play(); //It starts to play the music, even if it is already playing. So it plays multiple times..
            clicked = true;
        }
    }

}

我想在音乐结束后重复播放。

希望有人能帮我解决这个问题!

编辑:这就是我打开 "AnotherClass".

的方式
StackPane stockPane = FXMLLoader.load(Resource.onClassPath("AnotherClass.fxml").getURL());
root.getChildren().setAll(stockPane);

AnotherClass.javaAnotherClass.fxml 的控制器-Class。

让您的 Player 保持静态,不要实例化它两次或更多次。

public class Main {

    public static final Media musicMedia = new Media(new File("music.mp3").toURI().toString());
    public static final MediaPlayer mediaPlayer = new MediaPlayer(musicMedia );

    public static void main(String[] args) {
    }

}

您不需要自己的布尔值来切换 stop/play。只需使用 MediaPlayer.Status。如果正在播放音乐,还实施 javafx.fxml.Initializable 进行第一次测试。

public class AnotherClass implements Initializable {

    private static boolean firstTime = true;
    MediaPlayer mp3 = Main.mediaPlayer;

    @FXML
    private Button musicButton;

    @Override
    public void initialize(URL location, ResourceBundle resources)
    {
        if (firstTime)
        {
            mp3.statusProperty().addListener((o, oldVal, newVal) -> updateButton(newVal));
            firstTime = false;
        }
        updateButton(mp3.getStatus());
    }

    @FXML
    public void musicButtonClicked(ActionEvent e) throws IOException {
        switch(mp3.getStatus()) {
            case PLAYING:
                mp3.stop();
                break;
            default:
                mp3.play();
                break;
        }
    }

    private void updateButton(MediaPlayer.Status status)
    {
        switch(status) {
            case PLAYING:
                this.musicButton.setText("Stop Music");
                break;
            default:
                this.musicButton.setText("Play Music");
                break;
        }
    }
}

I want to repeat the music after it finished

将 MediaPlayer 的 CycleCount 设置为 INDEFINITE。

mp3.setCycleCount(MediaPlayer.INDEFINITE);

It starts to play the music, even if it is already playing. So it plays multiple times..

我的猜测是您以某种方式设法多次调用 root.getChildren().setAll(stockPane);;或者它会在每次发生某些事情时再次调用(可能是在按钮或选项卡上单击 - 您的应用程序是否组织在选项卡中?)。多次调用此方法将导致按钮重叠和 MediaPlayer 的新实例在实例化时不播放 - 因此单击 stop/play 按钮不会停止旧的 MediaPlayer,但会启动新的 MediaPlayer .