{"id":2478,"date":"2013-10-18T11:17:28","date_gmt":"2013-10-18T09:17:28","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2478"},"modified":"2013-10-20T20:02:39","modified_gmt":"2013-10-20T18:02:39","slug":"javafx-cdi-weld","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/10\/javafx-cdi-weld\/","title":{"rendered":"JavaFX + CDI (Weld)"},"content":{"rendered":"<p>Put in the class path:<\/p>\n<ul>\n<li><a href=\"http:\/\/mvnrepository.com\/artifact\/javax.enterprise\/cdi-api\">http:\/\/mvnrepository.com\/artifact\/javax.enterprise\/cdi-api<\/a><\/li>\n<li><a href=\"http:\/\/mvnrepository.com\/artifact\/org.jboss.weld\/weld-core\/\">http:\/\/mvnrepository.com\/artifact\/org.jboss.weld\/weld-core\/<\/a><\/li>\n<li><a href=\"http:\/\/mvnrepository.com\/artifact\/org.jboss.weld.se\/weld-se\/\">http:\/\/mvnrepository.com\/artifact\/org.jboss.weld.se\/weld-se\/<\/a><\/li>\n<\/ul>\n<p>The challenge is to bring FXMLLoader and CDI together, because JavaFX is creating naked objects by itself, now they have to be &#8222;CDI-aware&#8220;.<\/p>\n<pre lang=\"java\">package tutego.fx;\r\n\r\nimport java.nio.charset.*;\r\nimport javafx.fxml.FXMLLoader;\r\nimport javafx.util.Callback;\r\nimport javax.enterprise.inject.Instance;\r\nimport javax.enterprise.inject.Produces;\r\nimport javax.inject.Inject;\r\n\r\npublic class FXMLLoaderProducer\r\n{\r\n  @Inject\r\n  Instance&lt;Object&gt; instance;\r\n\r\n  @Produces\r\n  public FXMLLoader createLoader()\r\n  {\r\n    return new FXMLLoader( null, null, null, new Callback&lt;Class&lt;?&gt;, Object&gt;() {\r\n      @Override public Object call( Class&lt;?&gt; param ) {\r\n        return instance.select( param ).get();\r\n      }\r\n    }, StandardCharsets.UTF_8 );\r\n  }\r\n}<\/pre>\n<p>That was the hardest part.<\/p>\n<p>The first regular class has the unique main(String[]) method and it\u2019s a JavaFX application. It starts Weld, the CDI container.<\/p>\n<pre lang=\"java\">package tutego.fx;\r\n\r\nimport java.io.IOException;\r\nimport javafx.application.Application;\r\nimport javafx.stage.Stage;\r\nimport org.jboss.weld.environment.se.*;\r\n\r\npublic class Main extends Application\r\n{\r\n  private Weld weld;\r\n\r\n  public static void main( String[] args )\r\n  {\r\n    Application.launch( args );\r\n  }\r\n\r\n  @Override\r\n  public void init()\r\n  {\r\n    weld = new Weld();\r\n  }\r\n\r\n  @Override\r\n  public void start( Stage stage ) throws IOException\r\n  {\r\n    weld.initialize().instance().select( FxMain.class ).get().start( stage, getParameters() );\r\n  }\r\n\r\n  @Override\r\n  public void stop()\r\n  {\r\n    weld.shutdown();\r\n  }\r\n}<\/pre>\n<p>Weld delegates to the FxMain class, the first CDI-enabled class:<\/p>\n<pre lang=\"java\">package tutego.fx;\r\n\r\nimport java.io.*;\r\nimport javafx.application.Application.Parameters;\r\nimport javafx.fxml.FXMLLoader;\r\nimport javafx.scene.*;\r\nimport javafx.stage.Stage;\r\nimport javax.inject.Inject;\r\n\r\npublic class FxMain\r\n{\r\n  @Inject\r\n  private FXMLLoader fxmlLoader;\r\n\r\n  public void start( Stage stage, Parameters parameters ) throws IOException\r\n  {\r\n    try ( InputStream fxml = RandomController.class.getResourceAsStream( \"\/random.fxml\" ) ) {\r\n      Parent root = (Parent) fxmlLoader.load( fxml );\r\n      stage.setScene( new Scene( root ) );\r\n      stage.show();\r\n    }\r\n  }\r\n}<\/pre>\n<p>The injected FXMLLoader now has to load the FXML-file random.fxml:<\/p>\n<pre lang=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n\r\n&lt;?import java.lang.*?&gt;\r\n&lt;?import javafx.scene.control.*?&gt;\r\n&lt;?import javafx.scene.layout.*?&gt;\r\n&lt;?import javafx.scene.text.*?&gt;\r\n\r\n&lt;VBox xmlns:fx=\"http:\/\/javafx.com\/fxml\" fx:controller=\"tutego.fx.RandomController\"&gt;\r\n  &lt;children&gt;\r\n    &lt;Button onAction=\"#onButtonClick\" text=\"Next random\" \/&gt;\r\n    &lt;Label id=\"text\" fx:id=\"label\" \/&gt;\r\n  &lt;\/children&gt;\r\n&lt;\/VBox&gt;<\/pre>\n<p>In the FXML-file there is a reference to the FX Controller. JavaFX has to load it and can make the injections with the help of our very first class. A regular service is getting injected into the controller:<\/p>\n<pre lang=\"java\">package tutego.fx;\r\n\r\nimport javafx.fxml.FXML;\r\nimport javafx.scene.control.Label;\r\nimport javax.inject.Inject;\r\n\r\npublic class RandomController\r\n{\r\n  @FXML\r\n  private Label label;\r\n\r\n  @Inject\r\n  private RandomService randomService;\r\n\r\n  @FXML\r\n  public void onButtonClick()\r\n  {\r\n    label.setText( \"Random \" + randomService.nextInt() );\r\n  }\r\n}<\/pre>\n<p>The service itself is a simple singleton:<\/p>\n<pre lang=\"java\">package tutego.fx;\r\n\r\nimport java.util.Random;\r\nimport javax.inject.Singleton;\r\n\r\n@Singleton\r\npublic class RandomService\r\n{\r\n  private Random rnd = new Random();\r\n\r\n  public int nextInt()\r\n  {\r\n    return rnd.nextInt();\r\n  }\r\n}<\/pre>\n<p>Thats it!<\/p>\n<p>PS: When you start, dont forget to put a (even blank) <em>beans.xml<\/em> in <em>META-INF<\/em>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Put in the class path: http:\/\/mvnrepository.com\/artifact\/javax.enterprise\/cdi-api http:\/\/mvnrepository.com\/artifact\/org.jboss.weld\/weld-core\/ http:\/\/mvnrepository.com\/artifact\/org.jboss.weld.se\/weld-se\/ The challenge is to bring FXMLLoader and CDI together, because JavaFX is creating naked objects by itself, now they have to be &#8222;CDI-aware&#8220;. package tutego.fx; import java.nio.charset.*; import javafx.fxml.FXMLLoader; import javafx.util.Callback; import javax.enterprise.inject.Instance; import javax.enterprise.inject.Produces; import javax.inject.Inject; public class FXMLLoaderProducer { @Inject Instance&lt;Object&gt; instance; @Produces public FXMLLoader [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[62],"tags":[81,65],"class_list":["post-2478","post","type-post","status-publish","format-standard","hentry","category-javafx","tag-cdi","tag-weld"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2478","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2478"}],"version-history":[{"count":2,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2478\/revisions"}],"predecessor-version":[{"id":2485,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2478\/revisions\/2485"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}