Java(FX)播放一种声音时,播放另一种声音
我有一个FX应用程序,从一开始,它就开始播放音乐,这很有效。 现在,当我打开一个方法在上面播放另一个声音时,我想要它 我将第二个声音编码为第一个声音,但它不起作用。我试着做一个新的Java(FX)播放一种声音时,播放另一种声音,java,multithreading,javafx,javasound,Java,Multithreading,Javafx,Javasound,我有一个FX应用程序,从一开始,它就开始播放音乐,这很有效。 现在,当我打开一个方法在上面播放另一个声音时,我想要它 我将第二个声音编码为第一个声音,但它不起作用。我试着做一个新的线程,但没有改变。 新的声音实际上在以某种方式播放。有时它根本不起作用。有时是完全的,有时只是一秒钟 新声法 public void showFight(int fighterLeft,int fighterRight)抛出中断异常{ //一些代码 新线程(()->{ 音乐2(); }).start(); 新线程(()
线程
,但没有改变。
新的声音实际上在以某种方式播放。有时它根本不起作用。有时是完全的,有时只是一秒钟
新声法
public void showFight(int fighterLeft,int fighterRight)抛出中断异常{
//一些代码
新线程(()->{
音乐2();
}).start();
新线程(()->{
试一试{
线程。睡眠(3000L);
}捕捉(中断异常e){
}
Platform.runLater(()->{
//FadeIn();
FightPane.setVisible(假);
});
}).start();
}
公共静态无效音乐C2(){
Media hit2=新媒体(JavaFXApplicationStratego.class.getResource(“/Sounds/fight.mp3”).toString());
MediaPlayer mediaPlayer2=新的MediaPlayer(hit2);
mediaPlayer2.play();
}
第一声
publicstaticvoid音乐(){
字符串bip=“/stopen.mp3”;
Media hit=new Media(JavaFXApplicationStratego.class.getResource(“/Sounds/stopen.mp3”).toString();
MediaPlayer=新的MediaPlayer(点击);
mediaPlayer.play();
}
您没有维护对MediaPlayer的强引用。这意味着只要调用#music()
返回,实例就有资格进行垃圾收集(同样的问题w.r.t.#music2()
)。一旦垃圾被收集,媒体将停止播放。由于垃圾收集周期不是在预定的时间发生的,而是根据需要发生的,所以您可以看到应用程序的不同实例之间的不同行为。修复方法是将MediaPlayer
实例存储在强可访问的位置,例如在类的字段中(假设类的实例也是强可访问的)
根据您在问题中提供的内容,也没有理由使用线程。在JavaFX中播放音乐已经是异步的。至于稍后在JavaFX应用程序线程上执行操作,最好使用。问答展示了这方面的例子。例如:
PauseTransition pt=新的PauseTransition(持续时间.秒(3));
pt.setOnFinished(e->FlightPane.setVisible(false));
pt.play();
注意:假设FlightPane
是一个字段的名称,最好将其命名为FlightPane
。请参阅。实际上,即使是第一首音乐也无法正常工作,当我启动应用程序时,它有时开始播放,有时不播放,有时仅播放一秒钟。但这是另一个问题,所以您希望完成的是播放线程内部执行的同步声音,对吗?如果是这样的话,那么看看这个