Search code examples
osgijavafx-8apache-felixipojo

Using iPOJO in a JavaFX Application


I am doing a Javafx application in Apache Felix along with some experiments using iPOJO.

First is I called the Application.launch() method in a different class and then start an another class containing the iPOJO @Requires like this:

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();
    }

}

This implementation throws this exception, java.lang.IllegalStateException: Toolkit not initialized but the iPOJO located the implementation class of the LibraryClass interface.

After some research I found out that the application should be inside the class that extends the javafx.application.Application so I did some restructuring.

@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);
    }

}

Edit

The LibraryClass interface and implementation:

@Component
@Provides
@Instantiate
public class LibraryClassImplementation implements LibraryClass {

    public void someMethod(){
        system.out.println("Hello Javafx using iPOJO");
    }

}

public interface LibraryClass {
    public void someMethod();
}

Now the iPOJO throws a RuntimeException and the LibraryClass becomes null and the application throws a NullPointerException.

My questions are:

  • Is it possible to use iPOJO in this situation?
  • If it is what is the right way to use iPOJO in a JavaFX application?

Thanks in advance! :D


Solution

  • A JavaFX application instance has to be created by the JavaFX Platform using one of the static launch methods of the Application class. AFAIK it's not possible that some other framework such as iPOJO instantiates the class. In the second implementation however you've annotated the Application with some iPOJO (?) annotations, which will create an instance of the class, I guess. But it's the launch method, which should create the application instance, not a framework.

    In the first implementation you're trying to call the launch method in the JavaFX Application Thread. But it's the launch method which starts the JavaFX Platform and the JavaFX Application Thread. Also note that the launch methods does not return until the application exits.

    That said, note that I've released some Early Access versions of Drombler FX, a new Rich Client Platform for JavaFX based on OSGi (Apache Felix) and Maven.

    As an application framework it makes sure JavaFX and OSGi will get started properly and it provides the main window.

    You can read more about Drombler FX here: http://puces-blog.blogspot.ch/search/label/Drombler

    So far I'm using Declarative Services (generated from the Apache Felix SCR Annotations), but I guess it should also be possible to use iPOJO for new services.

    There's a Getting Started page which explains how to create, build and run a Drombler FX sample application with a few simple steps.