首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同实例中的Java MusicPlay

不同实例中的Java MusicPlay
EN

Stack Overflow用户
提问于 2018-03-16 12:06:36
回答 1查看 170关注 0票数 0

我有一个带有MusicPlayer的主类。它播放音乐。现在我需要停下来,在另一节课上演奏音乐。

代码语言:javascript
复制
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){
    }

}

所以现在,我要这样做:如果音乐在播放,我点击按钮,音乐就应该停止播放。如果它不播放音乐,我按下按钮,它应该开始播放音乐。我希望你不要理会我的问题。

代码语言:javascript
复制
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“的。

代码语言:javascript
复制
StackPane stockPane = FXMLLoader.load(Resource.onClassPath("AnotherClass.fxml").getURL());
root.getChildren().setAll(stockPane);

AnotherClass.javaAnotherClass.fxml的控制器类.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-16 12:25:56

让玩家对你的静态,不要实例化它两次或更多。

代码语言:javascript
复制
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) {
    }

}

您不需要自己的布尔值来切换停止/播放。只需使用MediaPlayer.Status即可。如果音乐正在播放,也为第一次测试实现javafx.fxml.Initializable

代码语言:javascript
复制
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;
        }
    }
}

我想在音乐结束后再重复一遍。

将CycleCount的MediaPlayer设置为不确定。

代码语言:javascript
复制
mp3.setCycleCount(MediaPlayer.INDEFINITE);

它开始播放音乐,即使它已经在播放了。所以它会多次播放..。

我的猜测是,您以某种方式多次调用了root.getChildren().setAll(stockPane);;或者每次发生事情时都会再次调用它(可能是在Button或Tab单击时--您的应用程序是在Tabs中组织的吗?)多次调用此按钮将导致重叠按钮和MediaPlayer的新实例,这些按钮和实例在实例化时没有播放-因此单击“停止/播放”按钮不会停止旧的MediaPlayer,而是启动新的MediaPlayer。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49320389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档