问题
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?
回答1:
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;
来源:https://stackoverflow.com/questions/34469447/grouping-together-javafx-fxml-objects