如何从FXML JavaFX设置节点?

时间:2018-07-10 02:24:44

标签: javafx fxml

我用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);
    }

我想做的是以下事情:

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

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

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

使它起作用的唯一方法是添加:

this.setLeft(this.sideMenu);

OR

this.setLeft(_tabs);

为什么我认为这应该行不通,因为我已经说过sideMenu位于Left BorderPane一侧,所以我应该如何处理呢?

1 个答案:

答案 0 :(得分:0)

首先,从Custom.fxml中删除fx:controller="Transcoro.Controllers.TabManager"。控制器为MainLayout,您可以通过FXMLLoader进行设置。

第二,请勿在{{1​​}}中调用fxmlLoader.setRoot(this);。相反,您应该从Custom.fxml中检索出根节点,然后将其添加到MainLayout中,而MainLayout本身就是BorderPane

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

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

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