Java(FX) 在播放一种声音的同时播放另一种声音

标签 java multithreading javafx javasound

我有一个 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();
    }

最佳答案

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

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

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

注意: 假设 FlightPane 是字段的名称,理想情况下应将其命名为 flightPane。请参阅Java naming conventions .

关于Java(FX) 在播放一种声音的同时播放另一种声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59915485/

相关文章:

java - 集合中的新实体不会被持久化

java - ANDROID - 在线程内循环

python - 在 Python Twisted 线程中使用 Cmd 模块

java - Java多线程,但只有一个线程工作

java - Java中如何判断一个字符串是否为double

java - 如何在 Java 中使用流式处理从 Set 中创建 HashMap

java - 如何取消AsyncTask中的doInBackground

java - 移动 ImageView 对象时的并发处理

java - 在 JavaFX 中更改 ListView 字体大小

java - 在Java中收到错误并且不明白问题: Exception in Application init method java. lang.reflect.InitationTargetException