对用户隐藏Javafx实现
所以目前我正在做一个项目,在这个项目中,我需要在一个方法中启动一个快速的javafx窗口。由于我不想让类扩展应用程序,我的解决方案是创建一个扩展应用程序的内部类,并通过创建内部类的实例并在内部类中调用launch在方法中启动javafx窗口,如下所示对用户隐藏Javafx实现,java,javafx,Java,Javafx,所以目前我正在做一个项目,在这个项目中,我需要在一个方法中启动一个快速的javafx窗口。由于我不想让类扩展应用程序,我的解决方案是创建一个扩展应用程序的内部类,并通过创建内部类的实例并在内部类中调用launch在方法中启动javafx窗口,如下所示 public void createWindow() { Fx window = new Fx(); window.launchWindow(); } public static class Fx extends Applicat
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分离为一个单独的层/将代码解耦,但最好澄清这一点。