我正在Apache Felix
中做一个Javafx
应用程序,以及一些使用iPOJO
的实验。
首先,我在不同的类中调用了 Application.launch()
方法,然后启动另一个包含iPOJO @Requires
的类,如下所示:
public class JavafxApp extends Application {
@Override
public void start(Stage primaryStage){
/* Do nothing here because I thought I can initialize JavaFX in a different class */
}
public static void start(){
Platform.runLater(() -> {
launch(JavafxApplication.class);
});
}
}
@Component
@Instantiate
public class MyApplication {
@Requires
LibraryClass class;
@Validate
public void start(){
JavafxApp.start();
class.someMethod();
}
}
此实现引发此异常,java.lang.IllegalStateException: Toolkit not initialized
但iPOJO
找到LibraryClass
接口的实现类。
经过一些研究,我发现应用程序应该在扩展javafx.application.Application
的类中,所以我做了一些重组。
@Component
@Instantiate
public class JavafxApp extends Application {
@Requires
LibraryClass class;
@Override
public void start(Stage primaryStage){
class.someMethod();
}
@Validate
public void start(){
launch(JavafxApp.class);
}
}
编辑
LibraryClass
接口和实现:
@Component
@Provides
@Instantiate
public class LibraryClassImplementation implements LibraryClass {
public void someMethod(){
system.out.println("Hello Javafx using iPOJO");
}
}
public interface LibraryClass {
public void someMethod();
}
现在,iPOJO
抛出一个RuntimeException
,LibraryClass
变得null
,应用程序抛出一个NullPointerException
。
我的问题是:
- 在这种情况下可以使用
iPOJO
吗? - 如果是在
JavaFX
应用程序中使用iPOJO
的正确方法是什么?
提前感谢! :D
JavaFX 应用程序实例必须由 JavaFX 平台使用 Application 类的静态启动方法之一创建。 AFAIK 其他框架(如 iPOJO)不可能实例化该类。但是,在第二个实现中,您已经使用一些iPOJO(?)注释注释了应用程序,我猜这将创建该类的实例。但它是启动方法,它应该创建应用程序实例,而不是框架。
在第一个实现中,您尝试在 JavaFX 应用程序线程中调用启动方法。但它是启动JavaFX平台和JavaFX应用程序线程的启动方法。另请注意,在应用程序退出之前,启动方法不会返回。
也就是说,请注意,我已经发布了一些Drombler FX的抢先体验版本,这是一个基于OSGi(Apache Felix)和Maven的JavaFX新富客户端平台。
作为一个应用程序框架,它确保JavaFX和OSGi能够正确启动,并提供主窗口。
您可以在此处阅读有关Drombler FX的更多信息:http://puces-blog.blogspot.ch/search/label/Drombler
到目前为止,我正在使用声明性服务(从Apache Felix SCR注释生成),但我想也应该可以将iPOJO用于新服务。
有一个入门页面,其中解释了如何通过几个简单的步骤创建、构建和运行 Drombler FX 示例应用程序。