java - Javafx: link fx:id-s -


i have ui many components reused ; so, have few .fxml files linked. parent .fxml embeds this:

<fx:include source="child.fxml" fx:id="first"> <fx:include source="child.fxml" fx:id="second"> 

the child.fxml looks this:

<hbox xmlns="http://javafx.com/javafx"       xmlns:fx="http://javafx.com/fxml">     <label fx:id="label"/>     <combobox fx:id="combobox"/>     <textfield fx:id="firsttextfield"/>     <tableview fx:id="secondtextfield"/> </hbox> 

the parent.fxml has defined fx:controller="parentcontroller". question is, how can set/get data each individual child in parent. like:

first.getlabel().settext("this first label"); first.getcombobox().getvalue(); second.getlabel().settext("this second label"); ... 

please don't suggest answer fist.getchildren().get(0) and others similar methods.

i know can define 1 big .fxml, , give every single item id, want avoid duplicate code, , want split them in smaller components may become more understandable, , can reuse them.

you can inject controllers included fxml controller fxml including them:

public class parentcontroller {      @fxml     private childcontroller firstcontroller ;      @fxml     private childcontroller secondcontroller ;      @fxml     private pane childcontainer ; // container holding included fxmls      // ... } 

here assuming child.fxml declares controller class fx:controller="childcontroller". rule naming fields nested controllers fx:id of included fxml "controller" appended.

define appropriate data methods in controller (it bad practice allow direct access controls themselves):

public class childcontroller {      @fxml     private label label ;      @fxml     private combobox<string> combobox ;      // etc...      public void setdisplaytext(string text) {         label.settext(text);     }      public string getuserselectedvalue() {         return combobox.getvalue();     }      // ... } 

and in parentcontroller need

first.setdisplaytext("this first label"); first.getuserselectedvalue(); second.setdisplaytext("this second label"); 

etc.

if need include more instances of fxml defined in child.fxml dynamically @ runtime, need:

// modify resource name needed: fxmlloader loader = new fxmlloader(getclass().getresource("child.fxml")); parent childui = loader.load(); childcontroller childcontroller = loader.getcontroller(); childcontainer.getchildren().add(childui); 

Comments

Popular posts from this blog

php - Vagrant up error - Uncaught Reflection Exception: Class DOMDocument does not exist -

vue.js - Create hooks for automated testing -

Add new key value to json node in java -