对用户隐藏Javafx实现

对用户隐藏Javafx实现,java,javafx,Java,Javafx,所以目前我正在做一个项目,在这个项目中,我需要在一个方法中启动一个快速的javafx窗口。由于我不想让类扩展应用程序,我的解决方案是创建一个扩展应用程序的内部类,并通过创建内部类的实例并在内部类中调用launch在方法中启动javafx窗口,如下所示 public void createWindow() { Fx window = new Fx(); window.launchWindow(); } public static class Fx extends Applicat

所以目前我正在做一个项目,在这个项目中,我需要在一个方法中启动一个快速的javafx窗口。由于我不想让类扩展应用程序,我的解决方案是创建一个扩展应用程序的内部类,并通过创建内部类的实例并在内部类中调用launch在方法中启动javafx窗口,如下所示

public void createWindow() {
    Fx window = new Fx();
    window.launchWindow();
}

public static class Fx extends Application {
    private void launchWindow() {
        launch();
    }

    public void start(Stage stage) {
        //javafx code
    }
}
问题是内部类必须是公共的,因为javafx要求启动的类是公共的,否则它将抛出异常。这导致了用户现在能够访问内部类的问题,因为它是公共的

module app {
    requires javafx.graphics;
    exports com.example to javafx.graphics;
}

是否可以将此设置为私有或进行其他变通?或者我还有其他方法可以这样做吗?

使用
应用程序。启动
不是启动JavaFX运行时的唯一方法,它只是最常用的标准选项。另一个选项是使用(JavaFX9+)。该方法将启动JavaFX运行时,并在JavaFX应用程序线程上调用给定的
Runnable

使用此设置时,需要记住一些重要事项:

  • 每个JVM实例只能启动一次JavaFX运行时;第二次调用
    startup
    将导致
    IllegalStateException
    。如果您的方法可以被多次调用,那么您需要在第二次和后续调用中使用

  • 一旦关闭最后一个
    阶段
    ,默认情况下,JavaFX运行时将退出。一旦发生这种情况,除非重新启动整个JVM,否则无法再次启动它。要阻止这种情况发生,请使用。现在,您将负责使用停止JavaFX运行时

  • 使用
    startup
    可以绕过正常的JavaFX生命周期。换句话说,不会创建
    应用程序
    子类的实例,并且不会调用
    init()
    start(Stage)
    stop()
    方法

  • 如果应用程序的JavaFX部分微不足道,请注意,只要应用程序存在,运行时就会在启动后消耗资源。即使在关闭最后一个窗口(隐式退出已设置为
    false
    )后也是如此。解决这个问题的一个(可能是非常重要的)方法是在另一个可以根据需要销毁的进程中启动JavaFX


  • 如果您使用的是Java9+,那么另一个(或者至少是免费的)选项是使用模块。将
    应用程序
    类放入仅导出到
    javafx.graphics
    模块的包中。这将阻止其他模块访问您的
    应用程序
    类,即使它是公共的

    module app {
        requires javafx.graphics;
        exports com.example to javafx.graphics;
    }
    
    注意:这不会阻止人们使用类路径或使用
    --add exports
    ,但这将是“不正确地使用您的库”,这意味着行为未指定。

    要建议“另一种方法”,了解您这样做的动机将很有帮助。对于代码混淆,这是不够的。它可能试图将JavaFX分离为一个单独的层/将代码解耦,但最好澄清这一点。