【问题标题】:Java(FX) while playing one sound, play anotherJava(FX) 在播放一种声音的同时播放另一种声音
【发布时间】:2020-01-26 04:09:24
【问题描述】:

我有一个 FX 应用程序,它从一开始就开始播放音乐,这很有效。 现在,当我打开一个在其上播放另一个声音的方法时,我想要它。

我像第一个一样编码了第二个声音,但它不起作用。我尝试制作一个新的Thread,但没有任何变化。 新声音实际上以某种方式播放。有时它根本不播放。有时完全,有时仅一秒钟。

新声音的方法

    public void showFight(int fighterLeft, int fighterRight) throws InterruptedException {

        //Some code

        new Thread(() -> {
            music2();
        }).start();

        new Thread(() -> {
            try {
                Thread.sleep(3000L);
            } catch (InterruptedException e) {
            }
            Platform.runLater(() -> {
                //FadeIn();
                FightPane.setVisible(false);
            });
        }).start();

    }

    public static void music2() {
        Media hit2 = new Media(JavaFXApplicationStratego.class.getResource("/Sounds/fight.mp3").toString());
        MediaPlayer mediaPlayer2 = new MediaPlayer(hit2);
        mediaPlayer2.play();
    }

第一声

public static void music() {
        String bip = "/stopen.mp3";
        Media hit = new Media(JavaFXApplicationStratego.class.getResource("/Sounds/stopen.mp3").toString());
        MediaPlayer mediaPlayer = new MediaPlayer(hit);
        mediaPlayer.play();
    }

【问题讨论】:

  • 实际上,即使是第一首音乐也无法正常工作,当我启动应用程序时,它有时会开始播放,有时不播放,有时只播放一秒钟。但这是另一个问题
  • 所以您希望完成的是同时播放从线程内部执行的声音,对吧?如果是这样,那么看看这个SO link

标签: java multithreading javafx javasound


【解决方案1】:

您没有保持对MediaPlayer 的强烈引用。这意味着只要对#music() 的调用返回,该实例就有资格进行垃圾回收(与#music2() 相同的问题)。一旦垃圾收集,媒体将停止播放。由于垃圾收集周期不是在预定时间发生,而是在需要时发生,因此您会看到应用程序的不同实例之间的不同行为。解决方法是将MediaPlayer 实例存储在它们可以强访问的地方,例如在您的类的字段中(假设您的类的实例也是强可访问的)。

根据您在问题中提供的内容,也没有理由使用线程。在 JavaFX 中播放音乐已经是异步的。至于稍后在 JavaFX 应用程序线程 上执行操作,最好使用animation APIJavaFX periodic background task Q&A 展示了这方面的示例。例如:

PauseTransition pt = new PauseTransition(Duration.seconds(3));
pt.setOnFinished(e -> FlightPane.setVisible(false));
pt.play();

注意:假设FlightPane 是一个字段的名称,理想情况下应该命名为flightPane。见Java naming conventions

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多