I can't remember where I found the following allowing me to very simply
launch OSGI-JAVAFX apps, but I give here a skeleton that I use everywhere.
The  point is that I'm using NetBeans platform, and Ant, (it seems to be
also your case) because I can't be be connected to www.
The local Ant build's file for NetBeans is changed according to:

<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="default" basedir=".">
    <description>Builds, tests, and runs the project test.</description>
    <import file="nbproject/build-impl.xml"/>
    <property name="felix.dir" value="../../osgi_lib/tasks"/>  
    <property name="test.dir" value=".."/>  
    <taskdef name="ipojo"
             classname="org.apache.felix.ipojo.task.IPojoTask"
            
classpath="${felix.dir}/org.apache.felix.ipojo.ant-1.12.1.jar"/>
    <taskdef resource="aQute/bnd/ant/taskdef.properties" 
             classpath="${felix.dir}/bnd-1.50.0.jar"/>    
    <target depends="init,compile,-pre-pre-jar" name="-do-jar">
        <bnd 
            classpath="${build.dir}/classes" 
            files="bind.bnd"
            output="${dist.jar}"
            failok="false" 
            exceptions="true"   />   
        <ipojo input="${dist.jar}" classpath="${javac.classpath}" />  
        <copy file="${dist.jar}" todir="${test.dir}/bundles"/> 
    </target> 
</project>

Futhermore, in the config file I added these lines:

# To append packages to the default set of exported system packages,
# set this value.
org.osgi.framework.system.packages.extra=javafx.application;version=0.0.0, \
com.sun.browser.plugin; version=0.0.0, \
com.sun.deploy.uitoolkit.impl.fx; version=0.0.0, \
com.sun.deploy.uitoolkit.impl.fx.ui; version=0.0.0, \
com.sun.deploy.uitoolkit.impl.fx.ui.resources; version=0.0.0, \
com.sun.deploy.uitoolkit.impl.fx.ui.resources.image; version=0.0.0, \
com.sun.glass.events; version=0.0.0, \
com.sun.glass.ui; version=0.0.0, \
com.sun.glass.ui.delegate; version=0.0.0, \
com.sun.glass.ui.gtk; version=0.0.0, \
com.sun.glass.ui.mac; version=0.0.0, \
com.sun.glass.ui.win; version=0.0.0, \
com.sun.glass.ui.x11; version=0.0.0, \
com.sun.glass.utils; version=0.0.0, \
com.sun.javafx; version=0.0.0, \
com.sun.javafx.animation; version=0.0.0, \
com.sun.javafx.animation.transition; version=0.0.0, \
com.sun.javafx.applet; version=0.0.0, \
com.sun.javafx.application; version=0.0.0, \
com.sun.javafx.beans; version=0.0.0, \
com.sun.javafx.beans.annotations; version=0.0.0, \
com.sun.javafx.beans.event; version=0.0.0, \
com.sun.javafx.binding; version=0.0.0, \
com.sun.javafx.charts; version=0.0.0, \
com.sun.javafx.collections; version=0.0.0, \
com.sun.javafx.collections.annotations; version=0.0.0, \
com.sun.javafx.collections.transformation; version=0.0.0, \
com.sun.javafx.css; version=0.0.0, \
com.sun.javafx.css.converters; version=0.0.0, \
com.sun.javafx.css.parser; version=0.0.0, \
com.sun.javafx.cursor; version=0.0.0, \
com.sun.javafx.effect; version=0.0.0, \
com.sun.javafx.embed; version=0.0.0, \
com.sun.javafx.event; version=0.0.0, \
com.sun.javafx.font; version=0.0.0, \
com.sun.javafx.fxml; version=0.0.0, \
com.sun.javafx.fxml.builder; version=0.0.0, \
com.sun.javafx.fxml.expression; version=0.0.0, \
com.sun.javafx.geom; version=0.0.0, \
com.sun.javafx.geom.transform; version=0.0.0, \
com.sun.javafx.iio; version=0.0.0, \
com.sun.javafx.iio.bmp; version=0.0.0, \
com.sun.javafx.iio.common; version=0.0.0, \
com.sun.javafx.iio.gif; version=0.0.0, \
com.sun.javafx.iio.jpeg; version=0.0.0, \
com.sun.javafx.iio.png; version=0.0.0, \
com.sun.javafx.image; version=0.0.0, \
com.sun.javafx.image.impl; version=0.0.0, \
com.sun.javafx.jmx; version=0.0.0, \
com.sun.javafx.logging; version=0.0.0, \
com.sun.javafx.menu; version=0.0.0, \
com.sun.javafx.perf; version=0.0.0, \
com.sun.javafx.property; version=0.0.0, \
com.sun.javafx.property.adapter; version=0.0.0, \
com.sun.javafx.robot; version=0.0.0, \
com.sun.javafx.robot.impl; version=0.0.0, \
com.sun.javafx.runtime; version=0.0.0, \
com.sun.javafx.runtime.async; version=0.0.0, \
com.sun.javafx.runtime.eula; version=0.0.0, \
com.sun.javafx.scene; version=0.0.0, \
com.sun.javafx.scene.control; version=0.0.0, \
com.sun.javafx.scene.control.behavior; version=0.0.0, \
com.sun.javafx.scene.control.skin; version=0.0.0, \
com.sun.javafx.scene.control.skin.caspian; version=0.0.0, \
com.sun.javafx.scene.control.skin.resources; version=0.0.0, \
com.sun.javafx.scene.input; version=0.0.0, \
com.sun.javafx.scene.layout.region; version=0.0.0, \
com.sun.javafx.scene.paint; version=0.0.0, \
com.sun.javafx.scene.shape; version=0.0.0, \
com.sun.javafx.scene.text; version=0.0.0, \
com.sun.javafx.scene.transform; version=0.0.0, \
com.sun.javafx.scene.traversal; version=0.0.0, \
com.sun.javafx.scene.web; version=0.0.0, \
com.sun.javafx.scene.web.behavior; version=0.0.0, \
com.sun.javafx.scene.web.skin; version=0.0.0, \
com.sun.javafx.sg; version=0.0.0, \
com.sun.javafx.sg.prism; version=0.0.0, \
com.sun.javafx.stage; version=0.0.0, \
com.sun.javafx.tk; version=0.0.0, \
com.sun.javafx.tk.desktop; version=0.0.0, \
com.sun.javafx.tk.quantum; version=0.0.0, \
com.sun.javafx.util; version=0.0.0, \
com.sun.media.jfxmedia; version=0.0.0, \
com.sun.media.jfxmedia.control; version=0.0.0, \
com.sun.media.jfxmedia.effects; version=0.0.0, \
com.sun.media.jfxmedia.events; version=0.0.0, \
com.sun.media.jfxmedia.locator; version=0.0.0, \
com.sun.media.jfxmedia.logging; version=0.0.0, \
com.sun.media.jfxmedia.track; version=0.0.0, \
com.sun.media.jfxmediaimpl; version=0.0.0, \
com.sun.media.jfxmediaimpl.platform; version=0.0.0, \
com.sun.media.jfxmediaimpl.platform.gstreamer; version=0.0.0, \
com.sun.media.jfxmediaimpl.platform.java; version=0.0.0, \
com.sun.media.jfxmediaimpl.platform.osx; version=0.0.0, \
com.sun.openpisces; version=0.0.0, \
com.sun.prism; version=0.0.0, \
com.sun.prism.camera; version=0.0.0, \
com.sun.prism.d3d; version=0.0.0, \
com.sun.prism.d3d.hlsl; version=0.0.0, \
com.sun.prism.image; version=0.0.0, \
com.sun.prism.impl; version=0.0.0, \
com.sun.prism.impl.packrect; version=0.0.0, \
com.sun.prism.impl.paint; version=0.0.0, \
com.sun.prism.impl.ps; version=0.0.0, \
com.sun.prism.impl.shape; version=0.0.0, \
com.sun.prism.j2d; version=0.0.0, \
com.sun.prism.j2d.paint; version=0.0.0, \
com.sun.prism.paint; version=0.0.0, \
com.sun.prism.ps; version=0.0.0, \
com.sun.prism.render; version=0.0.0, \
com.sun.prism.shader; version=0.0.0, \
com.sun.prism.shape; version=0.0.0, \
com.sun.prism.tkal; version=0.0.0, \
com.sun.prism.util.tess; version=0.0.0, \
com.sun.prism.util.tess.impl.tess; version=0.0.0, \
com.sun.scenario; version=0.0.0, \
com.sun.scenario.animation; version=0.0.0, \
com.sun.scenario.animation.shared; version=0.0.0, \
com.sun.scenario.effect; version=0.0.0, \
com.sun.scenario.effect.impl; version=0.0.0, \
com.sun.scenario.effect.impl.hw; version=0.0.0, \
com.sun.scenario.effect.impl.hw.d3d; version=0.0.0, \
com.sun.scenario.effect.impl.hw.d3d.hlsl; version=0.0.0, \
com.sun.scenario.effect.impl.prism; version=0.0.0, \
com.sun.scenario.effect.impl.prism.ps; version=0.0.0, \
com.sun.scenario.effect.impl.prism.sw; version=0.0.0, \
com.sun.scenario.effect.impl.state; version=0.0.0, \
com.sun.scenario.effect.impl.sw; version=0.0.0, \
com.sun.scenario.effect.impl.sw.java; version=0.0.0, \
com.sun.scenario.effect.impl.sw.sse; version=0.0.0, \
com.sun.scenario.effect.light; version=0.0.0, \
com.sun.t2k; version=0.0.0, \
com.sun.webpane.perf; version=0.0.0, \
com.sun.webpane.platform; version=0.0.0, \
com.sun.webpane.platform.event; version=0.0.0, \
com.sun.webpane.platform.graphics; version=0.0.0, \
com.sun.webpane.sg; version=0.0.0, \
com.sun.webpane.sg.prism; version=0.0.0, \
com.sun.webpane.sg.prism.resources; version=0.0.0, \
com.sun.webpane.sg.prism.theme; version=0.0.0, \
com.sun.webpane.sg.theme; version=0.0.0, \
com.sun.webpane.webkit; version=0.0.0, \
com.sun.webpane.webkit.dom; version=0.0.0, \
com.sun.webpane.webkit.network; version=0.0.0, \
com.sun.webpane.webkit.network.about; version=0.0.0, \
com.sun.webpane.webkit.network.data; version=0.0.0, \
com.sun.webpane.webkit.unicode; version=0.0.0, \
javafx.animation; version=0.0.0, \
javafx.beans; version=0.0.0, \
javafx.beans.binding; version=0.0.0, \
javafx.beans.property; version=0.0.0, \
javafx.beans.property.adapter; version=0.0.0, \
javafx.beans.value; version=0.0.0, \
javafx.collections; version=0.0.0, \
javafx.collections.transformation; version=0.0.0, \
javafx.concurrent; version=0.0.0, \
javafx.embed.swing; version=0.0.0, \
javafx.embed.swt; version=0.0.0, \
javafx.event; version=0.0.0, \
javafx.fxml; version=0.0.0, \
javafx.geometry; version=0.0.0, \
javafx.scene; version=0.0.0, \
javafx.scene.canvas; version=0.0.0, \
javafx.scene.chart; version=0.0.0, \
javafx.scene.control; version=0.0.0, \
javafx.scene.control.cell; version=0.0.0, \
javafx.scene.effect; version=0.0.0, \
javafx.scene.image; version=0.0.0, \
javafx.scene.input; version=0.0.0, \
javafx.scene.layout; version=0.0.0, \
javafx.scene.media; version=0.0.0, \
javafx.scene.paint; version=0.0.0, \
javafx.scene.shape; version=0.0.0, \
javafx.scene.text; version=0.0.0, \
javafx.scene.transform; version=0.0.0, \
javafx.scene.web; version=0.0.0, \
javafx.stage; version=0.0.0, \
javafx.util; version=0.0.0, \
javafx.util.converter; version=0.0.0, \
netscape.javascript; version=0.0.0

for JAVAFX classes to be imported. Also note that sometimes, JAVAFX classes
that are not in your java file's import section, must explicitly appeared in
the import-package's declaration of the bnd file. However Felix flags these
missing classes  at run time.

*I) StageService bundle*
The first bundle is a simple service

package em.widget.stage.service;

import javafx.stage.Stage;

public interface StageService {

    public String STAGE_NAME = "stage.name";

    public Stage getStage();
}

with a simple method getStage(). Each JAVAFX widget (a Stage in JAVAFX
defining a "window" on the screen) implements this service. Its name is the
service property's String defined by STAGE_NAME.

*II) JAVAFX Launching bundle*
The following lines are the JAVAFX launcher. They implement a StageService
with no name.

package em.widget.stage.impl;

import em.widget.stage.service.StageService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.stage.Stage;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Provides;

@Component
@Provides
public class StageImpl extends Application implements StageService {

    private static Stage pstage = null;
    private static Thread t;

    /**
     * The local Stage is sets.
     *
     * @param primaryStage The stage
     * @throws Exception
     */
    @Override
    public void start(Stage primaryStage) throws Exception {
        pstage = primaryStage;
        synchronized (t) {
            t.notify();
        }
    }

    @Override
    public Stage getStage() {
        if (pstage == null) {
            Executors.defaultThreadFactory().newThread(() -> {
               
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
                launch();
            }).start();
            t = Thread.currentThread();
            synchronized (t) {
                try {
                    t.wait();
                } catch (InterruptedException ex) {
                   
Logger.getLogger(StageService.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return pstage;
    }
}

*III) Defining your widget.*
You have now to write your widgets like the following one which is a JAVAFX
interface to connection's parameters. The fxml file is within the package
directory, and the four lines below DBWidget's creator take into account the
special OSGI class loader. Everything else is usual in JAVAFX apps.

package em.widget.connection.impl;

import em.persistence.service.ConnectionService;
import em.widget.stage.service.StageService;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Context;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.annotations.ServiceProperty;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import em.widget.datas.service.DatasWidgetService;
import org.osgi.framework.BundleException;

@Component
@Provides
public class ConnectionWidgetImpl implements StageService {

    @FXML
    TextField adminuser, user, dbname, ip, port, threadnumber;
    @FXML
    PasswordField adminpassword, password;
    @FXML
    Button button1;

    @Context
    BundleContext context;
    @Requires
    ConnectionService connectionService;

    @ServiceProperty(name = STAGE_KIND)
    String kind;
    Stage theStage;
    Boolean connected = false;
    DatasWidgetService datasWidgetService;
    ChangeListener<String> threadsNumberListener = new
ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable,
String oldValue, String newValue) {
            try {
                double t = Integer.valueOf(newValue);
                if (t <= 0) {
                    threadnumber.setText(oldValue);
                }
            } catch (NumberFormatException nfe) {
                threadnumber.setText("1");
            }
        }
    };

    public ConnectionWidgetImpl() {
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
        FXMLLoader.setDefaultClassLoader(getClass().getClassLoader());
        fxmlLoader.setLocation(getClass().getResource("Widget.fxml"));
        // Avoid the controller in fxml file, and declares itself as the
controller
        fxmlLoader.setController(this);
        theStage = new Stage();
        theStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                try {
                    ServiceReference[] sr =
context.getServiceReferences(StageService.class.getName(), "(" +
StageService.STAGE_KIND + "=*)");
                    for (ServiceReference sr1 : sr) {
                        ((StageService)
context.getService(sr1)).getStage().close();
                    }
                    context.getBundle(0).stop();
                } catch (InvalidSyntaxException | BundleException ex) {
                   
Logger.getLogger(ConnectionWidgetImpl.class.getName()).log(Level.SEVERE,
null, ex);
                }
            }
        });
        try {
            theStage.setTitle("DataBase Connection");
            theStage.setScene(new Scene(fxmlLoader.load()));
        } catch (IOException ex) {
           
Logger.getLogger(ConnectionWidgetImpl.class.getName()).log(Level.SEVERE,
null, ex);
        }
       
adminuser.textProperty().bindBidirectional(connectionService.getAdminUser());
        ip.textProperty().bindBidirectional(connectionService.getIP());
        port.textProperty().bindBidirectional(connectionService.getPort());
        user.textProperty().bindBidirectional(connectionService.getUser());
       
dbname.textProperty().bindBidirectional(connectionService.getDBName());
       
adminpassword.textProperty().bindBidirectional(connectionService.getAdminPassword());
       
password.textProperty().bindBidirectional(connectionService.getPassword());
        threadnumber.textProperty().addListener(threadsNumberListener);
       
threadnumber.textProperty().bindBidirectional(connectionService.getThreadsNumber());
        button1.setText("Connect");
        button1.setStyle("-fx-color:tomato");
    }

    @Override
    public Stage getStage() {
        return theStage;
    }

    @FXML
    public void connect(ActionEvent ae) {
......
    }
*IV) Starting your app*
After calling "mainStageService.getStage();" in the following code, the
JAVAFX thread is running, and it's simple for the previous widget to be
displayed on screen.

package em.test;

import java.util.Properties;
import org.apache.felix.ipojo.ConfigurationException;
import org.apache.felix.ipojo.Factory;
import org.apache.felix.ipojo.MissingHandlerException;
import org.apache.felix.ipojo.UnacceptableConfiguration;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Context;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Requires;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import em.widget.stage.service.StageService;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Platform;

@Component
@Instantiate
public class DBWidget {

    @Context
    BundleContext context;
    @Requires(filter =
"(factory.name=em.widget.connection.impl.ConnectionWidgetImpl)")
    Factory persistenceStageFactory;


    public DBWidget()  {
        // Creating the mainstage object
        mainStageFactory.createComponentInstance(null);
        ServiceReference<StageService> stageServiceRef =
context.getServiceReference(StageService.class);
        StageService mainStageService = (StageService)
context.getService(stageServiceRef);
        // Then start the FX thread
        mainStageService.getStage();

        // Creates a widget on FX thread.
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                try {
                    Properties d = new Properties();
                    d.put(StageService.STAGE_KIND, "DBConnect");
                    persistenceStageFactory.createComponentInstance(d);
                    ServiceReference[] sr =
context.getServiceReferences(StageService.class.getName(), "(" +
StageService.STAGE_KIND + "=DBConnect)");
                    StageService persistentStageService = (StageService)
context.getService(sr[0]);
                    // show the connect widget
                    persistentStageService.getStage().show();
                } catch (UnacceptableConfiguration | MissingHandlerException
| ConfigurationException | InvalidSyntaxException ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE,
null, ex);
                }
            }
        });
        .......



--
View this message in context: 
http://apache-felix.18485.x6.nabble.com/Re-Felix-and-JavaFX-tp5021784p5021880.html
Sent from the Apache Felix - Users mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@felix.apache.org
For additional commands, e-mail: users-h...@felix.apache.org

Reply via email to