gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:04:37 30 4
gpt4 key购买 nike

我有一个 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com