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:
iPOJO
in this situation? iPOJO
in a JavaFX
application?Thanks in advance! :D
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.