我在Javafx
进行了Apache Felix
申请,并使用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
? iPOJO
应用程序中使用JavaFX
的正确方法是什么?提前致谢! :d
答案 0 :(得分:0)
JavaFX应用程序实例必须由JavaFX平台使用Application类的静态启动方法之一创建。 AFAIK它不可能像iPOJO这样的其他框架实例化该类。然而,在第二个实现中,您已经使用一些iPOJO(?)注释注释了应用程序,我想这将创建该类的实例。但它是启动方法,它应该创建应用程序实例,而不是框架。
在第一个实现中,您尝试在JavaFX Application Thread中调用launch方法。但它是启动JavaFX平台和JavaFX应用程序线程的启动方法。 另请注意,在应用程序退出之前,启动方法不会返回。
那就是说,请注意我已经发布了一些早期版本的Drombler FX,这是一个基于OSGi(Apache Felix)和Maven的新的JavaFX富客户端平台。
作为一个应用程序框架,它确保JavaFX和OSGi能够正常启动并提供主窗口。
您可以在此处详细了解Drombler FX:http://puces-blog.blogspot.ch/search/label/Drombler
到目前为止,我使用的是声明式服务(由Apache Felix SCR Annotations生成),但我想也应该可以将iPOJO用于新服务。
这是一个Getting Started页面,通过几个简单的步骤解释了如何创建,构建和运行Drombler FX示例应用程序。