Hi Stephen; Thanks for the documentationing it. 21 Şub 2016 21:23 tarihinde "Stephen Winnall" <st...@winnall.ch> yazdı:
> I’ve now got a subclass of javafx.application.Application that runs as an > OSGi service and references other OSGi services under Java 8SE. I’ve tried > to document it on Github (see https://github.com/winnall/OSGiJavaFXUsage) > for the benefit of posterity. > > Let me know if there are any mistakes or improvements required in the - > sparse - documentation. I’m also not very good at Git :-( > > Thanks to Erik de Rijcke, Maurice, Anirvan Sardar and Kevin Rushforth for > their comments, all of which guided me - bouncing off the walls - to the > goal. > > Steve > > > > On 20 Feb 2016, at 20:37, Erik De Rijcke <derijcke.e...@gmail.com> > wrote: > > > > This way only the app will be accessible by other components through the > service registry. The app itself can not have any @reference because it it > is javafx itself that instantiates the app object and not the osgi > declarative services framework (which also takes care of injecting your > dependencies). > > > > The way to work around this in java8 is to take the approach I describe, > as far as I know that is the only workaround to get scr and javafx glued > together. > > > > In javafx 9 this would be fixed by having your service component > implement runnable and use the api described by kevin, as you can reuse the > object created by the osgi framework. > > > > On Sat, Feb 20, 2016 at 3:27 PM, Maurice <i...@cuhka.com <mailto: > i...@cuhka.com>> wrote: > > That is why the bundle activator creates a bundle-singleton of itself, > that way the app can access the OSGi world. In my case to register itself > as a service. > > > > > > @Override > > public void start(Stage primaryStage) throws Exception { > > .... > > primaryStage.show(); > > > > Dictionary<String, ?> properties = createDictionary(); > > BundleContext bundleContext = > UdooActivator.bundleActivator().getBundleContext(); > > > bundleContext.registerService(com.cuhka.home.application.Application.class, > this, properties); > > } > > > > Maurice. > > Op 20-02-16 om 15:08 schreef Stephen Winnall: > > > > Hi Maurice > > > > I have done something similar, but it has the following drawback in my > view: the class launched (Udoo15App in your case) does not run under OSGi > control, so it has no access to OSGi bundles or services, nor is it > accessible by them. If you don’t need that, you're OK. But I need that > class to be part of the OSGi world because other bundles/services are going > to add parts to the UI as they are instantiated. > > > > Steve > > > > On 20 Feb 2016, at 14:33, Maurice <i...@cuhka.com <mailto:i...@cuhka.com>> > wrote: > > > > > > For my OSGi based JavaFX solution on the Udoo Quad (ARM based Linux) I > created a service that publishes the application in the context.The > application does as little as possible. It sets up the primary stage as > fullscreen and puts a stackpane in it. Initially the stackpane displays a > 'boot logo', until the actual desktop bundle is started and registered with > the application. Note that you have to start the application on a separate > thread, as the thread will be blocked. > > > > On Java 8 this means that although the application bundle can't be > updated in a running OSGi container, but that is why the desktop exists. On > startup it registers itself, and thus the application content, with the > application, and when it is stopped it removes the content from the > application. The application has thus rarely to be updated itself. > > > > Regards, > > Maurice. > > > > > > > > public class UdooActivator implements BundleActivator { > > private static UdooActivator activator; > > private BundleContext context; > > > > static UdooActivator bundleActivator() { > > return requireNonNull(activator, "activator not set"); > > } > > > > @Override > > public void start(BundleContext context) throws Exception { > > this.context = context; > > activator = this; > > new Thread(() -> Application.launch(Udoo15App.class), "JavaFX > Desktop launcher").start(); > > } > > > > @Override > > public void stop(BundleContext context) throws Exception { > > Platform.exit(); > > } > > > > public BundleContext getBundleContext() { > > return context; > > } > > } > > > > Op 20-02-16 om 01:28 schreef Stephen Winnall: > > Anirvan, Kevin > > > > Thanks for this. > > > > I’m an expert neither in JavaFX nor in OSGi, but I think the basis of > the JavaFX/OSGi incompatibility is control. To work with OSGi, JavaFX has > to relinquish control of its startup sequence to OSGi in such a way that > javafx.application.Application (or its proxy) is instantiated by OSGi and > submits to OSGi’s bundle/service lifecycle. AN OSGi expert can probably > formulate this better… > > > > Platform.startup(runnable) /might/ do it. Platform.launch(class) doesn’t > because the object thereby instantiated is always under the control of > JavaFX - and thus not of OSGi. > > > > I’m not comfortable using JFXPanel: if I wanted to use Swing I wouldn’t > be trying to use JavaFX. But thank you for the hint. > > > > Steve > > > > On 19 Feb 2016, at 16:41, Kevin Rushforth<kevin.rushfo...@oracle.com > <mailto:kevin.rushfo...@oracle.com>> wrote: > > > > And for JDK 9 there is now: > > > > Platform.startup(Runnable); > > > > -- Kevin > > > > > > Anirvan Sarkar wrote: > > Hi Stephen, > > > > FYI, there is another way of initializing JavaFX runtime. Just use: > > > > new JFXPanel(); > > > > It is documented[1] that FX runtime is initialized when the first > JFXPanel > > instance is constructed. > > > > Also JavaFX 9 will provide an official API to start the FX platform [2] > [3]. > > > > > > [1] > > > https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable > < > https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable> > < > https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable > < > https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable > >>- > > [2]https://bugs.openjdk.java.net/browse/JDK-8090585 < > https://bugs.openjdk.java.net/browse/JDK-8090585> < > https://bugs.openjdk.java.net/browse/JDK-8090585 < > https://bugs.openjdk.java.net/browse/JDK-8090585>> > > [3] > > > http://download.java.net/jdk9/jfxdocs/javafx/application/Platform.html#startup-java.lang.Runnable > < > http://download.java.net/jdk9/jfxdocs/javafx/application/Platform.html#startup-java.lang.Runnable> > < > http://download.java.net/jdk9/jfxdocs/javafx/application/Platform.html#startup-java.lang.Runnable > < > http://download.java.net/jdk9/jfxdocs/javafx/application/Platform.html#startup-java.lang.Runnable > >>- > > > > > > On 18 February 2016 at 20:08, Stephen Winnall<st...@winnall.ch <mailto: > st...@winnall.ch>> <mailto:st...@winnall.ch <mailto:st...@winnall.ch>> > wrote: > > > > > > As I understand it, there are two ways of activating JavaFX: > > > > 1) sub-class javafx.application.Application or > > 2) call javafx.application.Application.launch() > > > > > > > > > > > > Op 20-02-16 om 01:28 schreef Stephen Winnall: > > Anirvan, Kevin > > > > Thanks for this. > > > > I’m an expert neither in JavaFX nor in OSGi, but I think the basis of > the JavaFX/OSGi incompatibility is control. To work with OSGi, JavaFX has > to relinquish control of its startup sequence to OSGi in such a way that > javafx.application.Application (or its proxy) is instantiated by OSGi and > submits to OSGi’s bundle/service lifecycle. AN OSGi expert can probably > formulate this better… > > > > Platform.startup(runnable) /might/ do it. Platform.launch(class) doesn’t > because the object thereby instantiated is always under the control of > JavaFX - and thus not of OSGi. > > > > I’m not comfortable using JFXPanel: if I wanted to use Swing I wouldn’t > be trying to use JavaFX. But thank you for the hint. > > > > Steve > > > > On 19 Feb 2016, at 16:41, Kevin Rushforth <kevin.rushfo...@oracle.com > <mailto:kevin.rushfo...@oracle.com>> wrote: > > > > And for JDK 9 there is now: > > > > Platform.startup(Runnable); > > > > -- Kevin > > > > > > Anirvan Sarkar wrote: > > Hi Stephen, > > > > FYI, there is another way of initializing JavaFX runtime. Just use: > > > > new JFXPanel(); > > > > It is documented[1] that FX runtime is initialized when the first > JFXPanel > > instance is constructed. > > > > Also JavaFX 9 will provide an official API to start the FX platform [2] > [3]. > > > > > > [1] > > > https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable > < > https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable> > < > https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable > < > https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable > >>- > > [2] https://bugs.openjdk.java.net/browse/JDK-8090585 < > https://bugs.openjdk.java.net/browse/JDK-8090585> < > https://bugs.openjdk.java.net/browse/JDK-8090585 < > https://bugs.openjdk.java.net/browse/JDK-8090585>> > > [3] > > > http://download.java.net/jdk9/jfxdocs/javafx/application/Platform.html#startup-java.lang.Runnable > < > http://download.java.net/jdk9/jfxdocs/javafx/application/Platform.html#startup-java.lang.Runnable> > < > http://download.java.net/jdk9/jfxdocs/javafx/application/Platform.html#startup-java.lang.Runnable > < > http://download.java.net/jdk9/jfxdocs/javafx/application/Platform.html#startup-java.lang.Runnable > >>- > > > > > > On 18 February 2016 at 20:08, Stephen Winnall <st...@winnall.ch <mailto: > st...@winnall.ch>> <mailto:st...@winnall.ch <mailto:st...@winnall.ch>> > wrote: > > > > > > As I understand it, there are two ways of activating JavaFX: > > > > 1) sub-class javafx.application.Application or > > 2) call javafx.application.Application.launch() > > > > > > > > > > > > > >