【问题标题】:Hide Javafx implementation from user对用户隐藏 Javafx 实现
【发布时间】:2019-10-24 13:11:11
【问题描述】:

所以目前我正在开发一个项目,我需要在一个方法中启动一个快速的 javafx 窗口。由于我不想让类扩展应用程序,我的解决方案是创建一个扩展应用程序的内部类,并通过创建内部类的实例并在内部类中调用启动来在方法中启动 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 要求启动的类是公共的,否则会抛出异常。这会导致用户现在能够访问内部类,因为它是公共的。

是否可以将其设为私有或采取其他解决方法?或者我应该有其他方法吗?

【问题讨论】:

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

标签: java javafx


【解决方案1】:

使用Application.launch 不是启动JavaFX 运行时的唯一方法,它只是标准且最常用的选项。另一种选择是使用Platform.startup(Runnable) (JavaFX 9+)。该方法将启动 JavaFX 运行时并在 JavaFX 应用程序线程上调用给定的Runnable

Platform.startup(() -> {
    Stage stage = new Stage();
    stage.setScene(/* your built scene */);
    stage.show();
});

在此设置中有一些重要事项需要牢记:

  1. 每个 JVM 实例只能启动一次 JavaFX 运行时;第二次调用startup 将得到IllegalStateException。如果您的方法可以被多次调用,那么您需要在第二次和后续调用中使用Platform.runLater(Runnable)

  2. 关闭最后一个Stage 后,JavaFX 运行时默认将退出。一旦发生这种情况,除非您重新启动整个 JVM,否则您将无法再次启动它。要阻止这种情况发生,请使用Platform.setImplicitExit(false)。您现在将负责使用 Platform.exit() 停止 JavaFX 运行时。

  3. 使用 startup 会绕过正常的 JavaFX 生命周期。换句话说,不会创建Application 子类的实例,也不会调用init()start(Stage)stop() 方法。

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


如果您使用的是 Java 9+,那么另一个(或至少是免费的)选项是使用模块。将您的 Application 类放在仅导出到 javafx.graphics 模块的包中。这将阻止其他模块访问您的 Application 类——即使它是公开的。

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

注意:这不会阻止人们使用类路径或使用--add-exports,但这将是“错误地使用你的库”,这意味着行为是未指定的。

【讨论】:

    猜你喜欢
    • 2019-03-18
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2020-12-11
    相关资源
    最近更新 更多