Java(FX) 在播放一种声音的同时播放另一种
Java(FX) while playing one sound, play another
我有一个 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()
returns(同样的问题 w.r.t。#music2()
),该实例就有资格进行垃圾回收。一旦收集到垃圾,媒体将停止播放。由于垃圾收集周期不会在预定时间发生,而是根据需要发生,因此您会看到应用程序不同实例之间的不同行为。解决方法是将 MediaPlayer
实例存储在它们可以很容易到达的地方,比如在你的 class 的字段中(假设你的 class 的实例也是很容易到达的)。
根据您在问题中提供的内容,也没有理由使用线程。在 JavaFX 中播放音乐已经是异步的。至于稍后在 JavaFX Application Thread 上执行操作,最好使用 animation API. The JavaFX 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.
我有一个 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()
returns(同样的问题 w.r.t。#music2()
),该实例就有资格进行垃圾回收。一旦收集到垃圾,媒体将停止播放。由于垃圾收集周期不会在预定时间发生,而是根据需要发生,因此您会看到应用程序不同实例之间的不同行为。解决方法是将 MediaPlayer
实例存储在它们可以很容易到达的地方,比如在你的 class 的字段中(假设你的 class 的实例也是很容易到达的)。
根据您在问题中提供的内容,也没有理由使用线程。在 JavaFX 中播放音乐已经是异步的。至于稍后在 JavaFX Application Thread 上执行操作,最好使用 animation API. The JavaFX 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.