在 JavaFX 应用程序中使用 iPOJO
Using iPOJO in a JavaFX Application
我正在 Apache Felix
中做一个 Javafx
应用程序以及一些使用 iPOJO
的实验。
首先,我在另一个 class 中调用了 Application.launch()
方法,然后启动另一个包含 iPOJO @Requires
的 class,如下所示:
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
接口的实现 class。
经过一些研究,我发现应用程序应该在扩展 javafx.application.Application
的 class 中,所以我做了一些重组。
@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 平台使用应用程序的静态启动方法之一创建 class。据我所知,iPOJO 等其他框架不可能实例化 class。然而,在第二个实现中,您已经使用一些 iPOJO (?) 注释对应用程序进行了注释,我猜这将创建 class 的实例。但它是启动方法,它应该创建应用程序实例,而不是框架。
在第一个实现中,您尝试调用 JavaFX 应用程序线程中的启动方法。但它是启动 JavaFX 平台和 JavaFX 应用程序线程的启动方法。
另请注意,在应用程序退出之前,启动方法不会 return。
也就是说,请注意,我已经发布了 Drombler FX 的一些抢先体验版本,这是一个基于 OSGi (Apache Felix) 和 Maven 的新的 JavaFX 富客户端平台。
作为一个应用程序框架,它确保 JavaFX 和 OSGi 能够正常启动并提供主要的 window。
您可以在此处阅读有关 Drombler FX 的更多信息:http://puces-blog.blogspot.ch/search/label/Drombler
到目前为止,我使用的是声明式服务(由 Apache Felix SCR Annotations 生成),但我想也应该可以将 iPOJO 用于新服务。
有一个 Getting Started 页面解释了如何通过几个简单的步骤创建、构建和 运行 Drombler FX 示例应用程序。
我正在 Apache Felix
中做一个 Javafx
应用程序以及一些使用 iPOJO
的实验。
首先,我在另一个 class 中调用了 Application.launch()
方法,然后启动另一个包含 iPOJO @Requires
的 class,如下所示:
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
接口的实现 class。
经过一些研究,我发现应用程序应该在扩展 javafx.application.Application
的 class 中,所以我做了一些重组。
@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 平台使用应用程序的静态启动方法之一创建 class。据我所知,iPOJO 等其他框架不可能实例化 class。然而,在第二个实现中,您已经使用一些 iPOJO (?) 注释对应用程序进行了注释,我猜这将创建 class 的实例。但它是启动方法,它应该创建应用程序实例,而不是框架。
在第一个实现中,您尝试调用 JavaFX 应用程序线程中的启动方法。但它是启动 JavaFX 平台和 JavaFX 应用程序线程的启动方法。 另请注意,在应用程序退出之前,启动方法不会 return。
也就是说,请注意,我已经发布了 Drombler FX 的一些抢先体验版本,这是一个基于 OSGi (Apache Felix) 和 Maven 的新的 JavaFX 富客户端平台。
作为一个应用程序框架,它确保 JavaFX 和 OSGi 能够正常启动并提供主要的 window。
您可以在此处阅读有关 Drombler FX 的更多信息:http://puces-blog.blogspot.ch/search/label/Drombler
到目前为止,我使用的是声明式服务(由 Apache Felix SCR Annotations 生成),但我想也应该可以将 iPOJO 用于新服务。
有一个 Getting Started 页面解释了如何通过几个简单的步骤创建、构建和 运行 Drombler FX 示例应用程序。