Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grouping together JavaFX FXML Objects

Exceptionally descriptive and informative answers will get a bounty worth 50 reputation from me.

I am developing an application in JavaFX, and for views, I use FXML.

<AnchorPane id="AnchorPane" fx:id="dashboard" prefHeight="400.0" prefWidth="600.0" stylesheets="@css/dashboard.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.hassanalthaf.telemart.viewmodels.DashboardViewModel">
   <children>
      <MenuBar maxWidth="600.0" minWidth="600.0" prefWidth="600.0">
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
              <MenuItem mnemonicParsing="false" text="Close" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Help">
            <items>
              <MenuItem mnemonicParsing="false" text="About" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
      <AnchorPane fx:id="home" layoutY="29.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="371.0" prefWidth="600.0" />
      <AnchorPane fx:id="about" layoutY="29.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="371.0" prefWidth="600.0" />
      <AnchorPane fx:id="users" layoutY="29.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="371.0" prefWidth="600.0" />
   </children>
</AnchorPane>

As you can see, this snippet contains some <AnchorPane>s with the IDs home, about, users. These are separate pages of my application. To manipulate those Panes, I have to inject them to my code like this:

@FXML
private AnchorPane home;

@FXML
private AnchorPane about;

@FXML
private AnchorPane users;

This may look neat for now, but when there is more than 20 pages, it may look a bit messy and tedious. Is there any way to group them into an array or something in a clean and efficient way?

like image 765
Hassan Althaf Avatar asked Dec 26 '15 07:12

Hassan Althaf


People also ask

What is group layout in JavaFX?

The JavaFX Group component is a container component which applies no special layout to its children. All child components (nodes) are positioned at 0,0 . A JavaFX Group component is typically used to apply some effect or transformation to a set of controls as a whole - as a group.

Is FXML annotation required?

The @FXML annotation is required for the controller class's private member fields; otherwise, field injection would fail.

What are groups in JavaFX?

In JavaFX, a group is a container component that does not apply any special layout for the children. Here, every child component or node will be kept at the position 0,0. Normally, this group component is mainly used to put transformations or effects to a control set together-that is, as a group.


1 Answers

You could use fx:define and fx:reference to place the elements in a List and in the scene graph and inject the list to the controller:

<AnchorPane id="AnchorPane" fx:id="dashboard" prefHeight="400.0" prefWidth="600.0" stylesheets="@css/dashboard.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.hassanalthaf.telemart.viewmodels.DashboardViewModel">
   <fx:define>
        <!-- create panes and store them in a list -->
        <ArrayList fx:id="panes">
            <AnchorPane fx:id="home" layoutY="29.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="371.0" prefWidth="600.0" />
            <AnchorPane fx:id="about" layoutY="29.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="371.0" prefWidth="600.0" />
            <AnchorPane fx:id="users" layoutY="29.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="371.0" prefWidth="600.0" />
        </ArrayList>
    </fx:define>
    <children>
        <MenuBar maxWidth="600.0" minWidth="600.0" prefWidth="600.0">
            <menus>
                <Menu mnemonicParsing="false" text="File">
                    <items>
                        <MenuItem mnemonicParsing="false" text="Close" />
                    </items>
                </Menu>
                <Menu mnemonicParsing="false" text="Help">
                    <items>
                        <MenuItem mnemonicParsing="false" text="About" />
                    </items>
                </Menu>
            </menus>
        </MenuBar>
        <!-- add panes in the list to scene graph -->
        <fx:reference source="home"/>
        <fx:reference source="about"/>
        <fx:reference source="users"/>
    </children>
</AnchorPane>

Controller

@FXML
private List<AnchorPane> panes;
like image 79
fabian Avatar answered Oct 12 '22 21:10

fabian