我正在Apache Felix中做一个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
发布于 2015-02-10 08:55:17
JavaFX应用程序实例必须由JavaFX平台使用应用程序类的静态启动方法之一创建。AFAIK不可能像iPOJO这样的其他框架实例化类。然而,在第二个实现中,您用一些iPOJO (?)对应用程序进行了注释。注释,这将创建类的一个实例,我猜。但是它是启动方法,它应该创建应用程序实例,而不是框架。
在第一个实现中,您试图调用JavaFX应用程序线程中的启动方法。但是它是启动JavaFX平台和JavaFX应用线程的启动方法。还请注意,在应用程序退出之前,启动方法不会返回。
尽管如此,请注意,我已经发布了德罗巴勒FX的一些早期访问版本,这是一个新的基于OSGi (Apache )和Maven的JavaFX富客户端平台。
作为一个应用程序框架,它确保JavaFX和OSGi能够正确启动,并提供主窗口。
您可以在这里阅读更多关于Drombler的内容:http://puces-blog.blogspot.ch/search/label/Drombler
到目前为止,我使用的是声明性服务(由Apache Felix SCR注释生成),但我想也可以将iPOJO用于新服务。
有一个快速入门页面解释了如何创建、构建和运行一个Drombler示例应用程序,只需几个简单的步骤。
https://stackoverflow.com/questions/28289948
复制相似问题