如何从 FXML JavaFX 设置节点?

How to set Nodes from FXML JavaFX?

我用 FXML 创建了一个布局,它由一个带有 sideMenu 的 BorderPane 和一个用于其他内容的 innerBorderPane 组成...

但是因为我才刚刚开始使用 JavaFX 中的 FXML,所以我只需要知道下一步该怎么做...

Custom.fxml(这是主要的 FXML 布局)

<?import javafx.scene.text.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>


<VBox fx:controller="Transcoro.Controllers.TabManager" alignment="TOP_CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="442.0" prefWidth="338.0" spacing="5.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <HBox prefHeight="59.0" prefWidth="124.0">
         <children>
            <VBox prefHeight="59.0" prefWidth="90.0" style="-fx-background-color: blue;" />
            <VBox alignment="CENTER_LEFT" prefHeight="59.0" prefWidth="165.0">
               <children>
                  <Label text="Bienvenido, Rodolfo">
                     <font>
                        <Font name="System Bold" size="15.0" />
                     </font>
                  </Label>
                  <Label text="Administrador" />
               </children>
               <opaqueInsets>
                  <Insets />
               </opaqueInsets>
               <HBox.margin>
                  <Insets />
               </HBox.margin>
               <padding>
                  <Insets left="10.0" />
               </padding>
            </VBox>
         </children>
         <VBox.margin>
            <Insets bottom="15.0" />
         </VBox.margin>
      </HBox>
      <Button alignment="CENTER" contentDisplay="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false" nodeOrientation="LEFT_TO_RIGHT" text="Unidades" textAlignment="CENTER" textFill="#2491ff" />
      <Button alignment="CENTER" contentDisplay="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false" nodeOrientation="LEFT_TO_RIGHT" text="Empleados" textAlignment="CENTER" textFill="#2491ff" />
      <Button alignment="CENTER" contentDisplay="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false" nodeOrientation="LEFT_TO_RIGHT" text="Clientes" textAlignment="CENTER" textFill="#2491ff" />
      <Button alignment="CENTER" contentDisplay="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false" nodeOrientation="LEFT_TO_RIGHT" text="Viajes" textAlignment="CENTER" textFill="#2491ff" />
   </children>
   <padding>
      <Insets top="20.0" />
   </padding>
</VBox>

sideMenu.fxml(这是sideMenu FXML布局)

<?import javafx.scene.text.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>


<fx:root type="javafx.scene.layout.VBox" alignment="TOP_CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="442.0" prefWidth="338.0" spacing="5.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <HBox prefHeight="59.0" prefWidth="124.0">
         <children>
            <VBox prefHeight="59.0" prefWidth="90.0" style="-fx-background-color: blue;" />
            <VBox alignment="CENTER_LEFT" prefHeight="59.0" prefWidth="165.0">
               <children>
                  <Label text="Bienvenido, Rodolfo">
                     <font>
                        <Font name="System Bold" size="15.0" />
                     </font>
                  </Label>
                  <Label text="Administrador" />
               </children>
               <opaqueInsets>
                  <Insets />
               </opaqueInsets>
               <HBox.margin>
                  <Insets />
               </HBox.margin>
               <padding>
                  <Insets left="10.0" />
               </padding>
            </VBox>
         </children>
         <VBox.margin>
            <Insets bottom="15.0" />
         </VBox.margin>
      </HBox>
      <Button alignment="CENTER" contentDisplay="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false" nodeOrientation="LEFT_TO_RIGHT" text="Unidades" textAlignment="CENTER" textFill="#2491ff" />
      <Button alignment="CENTER" contentDisplay="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false" nodeOrientation="LEFT_TO_RIGHT" text="Empleados" textAlignment="CENTER" textFill="#2491ff" />
      <Button alignment="CENTER" contentDisplay="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false" nodeOrientation="LEFT_TO_RIGHT" text="Clientes" textAlignment="CENTER" textFill="#2491ff" />
      <Button alignment="CENTER" contentDisplay="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false" nodeOrientation="LEFT_TO_RIGHT" text="Viajes" textAlignment="CENTER" textFill="#2491ff" />
   </children>
   <padding>
      <Insets top="20.0" />
   </padding>
</fx:root>

TabManager.java(这是 sideMenu JavaFX 控制器)

package Transcoro.Controllers;

import javafx.fxml.FXMLLoader;
import javafx.scene.layout.VBox;

import java.io.IOException;

public class TabManager extends VBox {

    public TabManager(){
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/resources/view/sideMenu.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);

        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
    }
}

MainLayout.java(这是 mainLayout JavaFX 控制器)

package Transcoro.Core;

import Transcoro.Controllers.TabManager;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.*;

import java.io.IOException;

public class MainLayout extends BorderPane {
    @FXML
    private VBox sideMenu;

    @FXML
    private BorderPane innerContent;

    @FXML
    private HBox upperMenu;

    @FXML
    private ScrollPane contentScroll;

    @FXML
    private VBox otherPane;

    public MainLayout(){

        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/resources/view/Custom.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);

        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }

        TabManager _tabs = new TabManager();
        this.setSideMenu(_tabs);
    }

我想做的是:

我有两个布局,base 是另一个 FXML 中的主布局和 sideMenu 布局

当我在我的根中实例化 mainLayout 时工作正常,然后当我想将 TabManager (VBox) 插入 sideMenu(来自 FXML 的 VBox)时它不起作用...我正在这样做:

    TabManager _tabs = new TabManager();
    this.setSideMenu(_tabs);

我让它工作的唯一方法是添加:

this.setLeft(this.sideMenu);

this.setLeft(_tabs);

我认为这不应该起作用,因为我已经说明了 sideMenu 在 Left BorderPane 一侧,关于我应该如何处理它有什么想法吗?

首先,从 Custom.fxml 中删除 fx:controller="Transcoro.Controllers.TabManager"。控制器是 MainLayout,您将通过 FXMLLoader.

设置它

其次,不要在MainLayout中调用fxmlLoader.setRoot(this);。您应该改为从 Custom.fxml 中检索根节点,然后将其添加到 MainLayout,它本身就是一个 BorderPane.

Parent root = fxmlLoader.getRoot();
this.setCenter(root);

这会将 Custom.fxml 中的所有内容作为 MainLayout 的中心子项。

第三,setLeft() 正在运行,因为您将 TabManager 实例(它是 VBox)设置为 MainLayout 的左子实例。 setSideMenu()(假定 @FXML private VBox sideMenu 的 setter 不起作用,因为 sideMenu 只是注入控制器的引用。当您更改此引用时,它不会更改原始布局。