为什么这个JavaFX播放器会冻结?

为什么这个JavaFX播放器会冻结?,javafx,Javafx,我正在尝试使用以下播放器: 公共类JavaFXPlayer扩展应用程序{ 私人媒体播放器; 私人媒体; 公共JavaFXPlayer(字符串strUrl){ this.media=新媒体(strUrl); } 公共游戏{ Application.launch(); } @凌驾 public void start(Stage primaryStage)引发异常{ mediaPlayer=新的mediaPlayer(媒体); //通过将此属性设置为true,将播放音频 mediaPlayer.set

我正在尝试使用以下播放器:

公共类JavaFXPlayer扩展应用程序{
私人媒体播放器;
私人媒体;
公共JavaFXPlayer(字符串strUrl){
this.media=新媒体(strUrl);
}
公共游戏{
Application.launch();
}
@凌驾
public void start(Stage primaryStage)引发异常{
mediaPlayer=新的mediaPlayer(媒体);
//通过将此属性设置为true,将播放音频
mediaPlayer.setAutoPlay(true);
primaryStage.setTitle(“播放音频”);
primaryStage.show();
}
@凌驾
公共停车场(){
如果(mediaPlayer!=null){
mediaPlayer.stop();
mediaPlayer.dispose();
}
}
}
然后我像这样运行:

public class MyApp extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception { ... }

}
JavaFXPlayer=newjavafxplayer(strUrl);
player.play();

但是,当我运行
player.play()
时,我的整个程序立即冻结。为什么会这样?

当通过
application#launch
启动JavaFX应用程序时,运行时会通过反射为您创建
应用程序
子类的实例。这给实施带来了一些限制:

  • 它必须是
    公共
  • 它必须有一个
    公共
    ,没有参数构造函数
  • 如果使用模块,则其包必须至少导出到
    javafx.graphics
    模块
如果您使用
应用程序
子类作为应用程序的主类,那么您不需要主方法,至少JavaFX版本8-121不需要。如果您确实有一个main方法,它应该如下所示:

public class MyApp extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception { ... }

}
您还可以使用其他一些类函数作为主类:

public class Main {

    public static void main(String[] args) {
        Application.launch(MyApp.class, args);
    }

}
无论您选择使用哪个,您都必须仍然有一个公共的无参数构造函数。这意味着您将无法通过构造函数传入
媒体
URL。也不清楚这个URL来自哪里。如果URL来自命令行参数,则可以通过
应用程序#getParameters()
应用程序
实例(例如,在
开始(阶段)
初始化()
)中访问这些URL。如果URL是硬编码的,您只需以不同的方式使用它(例如直接在
应用程序
子类中使用)

综上所述,我不完全清楚为什么您的应用程序会冻结,因为您没有提供最小的可复制示例。但是,调用
应用程序#启动
的线程在该方法调用中被阻止,直到JavaFX运行时退出。这意味着,如果在该线程上调用JavaFX应用程序线程,则可能会阻塞该线程



一,。JavaFX有特殊的处理方法,只要main类是
应用程序的实现
,就可以省略main方法。但是,随着JavaFX在版本11中从JDK中删除,此功能可能会在将来的版本中删除。

您真的不应该从
应用程序中调用
Application.launch()
类-应该只从程序的
main
方法调用它。调用
play
时,您试图实现什么目标?我想在
start
中运行代码,以便它播放音乐。如果我试图从程序中运行
Application.launch()
,我会收到一个错误,告诉我它不是
javafx.Application.Application
的子类。因此,我将调用放入我的
应用程序
类中。作为应用程序类启动此调用不应该工作:
应用程序。启动
需要一个不带参数的构造函数……您不应该自己实例化
JavaFXPlayer
。另外,
应用程序
子类必须有一个公共的无参数构造函数。