在JavaFX应用程序中使用iPOJO

时间:2015-02-03 01:34:54

标签: osgi javafx-8 apache-felix ipojo

我在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引发RuntimeExceptionLibraryClass变为null,应用程序抛出NullPointerException

我的问题是:

  • 在这种情况下是否可以使用iPOJO
  • 如果在iPOJO应用程序中使用JavaFX的正确方法是什么?

提前致谢! :d

1 个答案:

答案 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示例应用程序。