【问题标题】:Grouping together JavaFX FXML Objects将 JavaFX FXML 对象组合在一起
【发布时间】:2018-07-05 16:25:29
【问题描述】:

描述性和信息量非常丰富的答案将从我这里获得价值 50 声望的赏金。

我正在用 JavaFX 开发一个应用程序,对于视图,我使用 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>

如您所见,这个 sn-p 包含一些 &lt;AnchorPane&gt;s,ID 为 homeaboutusers。这些是我的应用程序的单独页面。要操作这些窗格,我必须将它们注入到我的代码中,如下所示:

@FXML
private AnchorPane home;

@FXML
private AnchorPane about;

@FXML
private AnchorPane users;

这可能现在看起来很整洁,但是当超过 20 页时,它可能看起来有点凌乱和乏味。有没有办法以干净有效的方式将它们组合成一个数组或其他东西?

【问题讨论】:

标签: java javafx javafx-2 fxml


【解决方案1】:

您可以使用fx:definefx:reference 将元素放置在List 和场景图中,并将列表注入控制器:

<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>

控制器

@FXML
private List<AnchorPane> panes;

【讨论】:

  • 哇,太棒了!谢谢。
  • 简单、聪明、整洁。绝对是专业提示。
  • 很好的解决方案,谢谢。请注意:SceneBuilder 似乎不支持&lt;fx:define&gt; 标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
相关资源
最近更新 更多