Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java(FX)播放一种声音时,播放另一种声音_Java_Multithreading_Javafx_Javasound - Fatal编程技术网

Java(FX)播放一种声音时,播放另一种声音

Java(FX)播放一种声音时,播放另一种声音,java,multithreading,javafx,javasound,Java,Multithreading,Javafx,Javasound,我有一个FX应用程序,从一开始,它就开始播放音乐,这很有效。 现在,当我打开一个方法在上面播放另一个声音时,我想要它 我将第二个声音编码为第一个声音,但它不起作用。我试着做一个新的线程,但没有改变。 新的声音实际上在以某种方式播放。有时它根本不起作用。有时是完全的,有时只是一秒钟 新声法 public void showFight(int fighterLeft,int fighterRight)抛出中断异常{ //一些代码 新线程(()->{ 音乐2(); }).start(); 新线程(()

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

我将第二个声音编码为第一个声音,但它不起作用。我试着做一个新的
线程
,但没有改变。 新的声音实际上在以某种方式播放。有时它根本不起作用。有时是完全的,有时只是一秒钟

新声法

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
。请参阅。

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