在 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 initializediPOJO 找到了 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.

我的问题是:

提前致谢! :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 示例应用程序。