当前位置: 首页 > 知识库问答 >
问题:

如何从FXML javafx设置节点?

邢璞
2023-03-14

我已经用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>

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

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

this.setLeft(_tabs);

我认为它不应该起作用,为什么,因为我已经声明了sideMenu在左侧边框边,有什么想法我应该如何处理它吗?

共有1个答案

宦博超
2023-03-14

首先,从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只是注入到控制器中的引用。更改此引用时,它不会更改原始布局。

 类似资料:
  • 问题内容: 我已经设置了一个Jenkins主节点,并且想要在同一网络中添加一个从节点。我需要在从机上安装Jenkins吗?还是可以在不首先安装Jenkins的情况下使用任意机器? 问题答案: 不,您根本不需要在任何从属计算机中安装Jenkins。 如果它是Linux从站,则只需要启用SSH访问即可。如果是Windows计算机,则使用Java并与 Jenkins提供的jar或通过Java Web c

  • 我想使用独立的Ignite集群设置IgniteSet并在Scala应用程序中填充它。 从Ignite cluster返回的错误是: 是包的一部分,因此错误表示存在某种版本不匹配。但我明确检查了我的Ignite集群使用的是1.1.0版本--在我的中有文件;并且我的应用程序使用相同的版本--在我显式设置的中(也试图完全排除此包): 此外,我找不到使用此类的版本:1.0.0和1.1.0都有 此外,上面的

  • 问题内容: 我有几个关于客户端节点的Elasticsearch问题: 我可以说:任何节点只要打开HTTP端口,我都可以将它们视为“客户端”节点,因为我们可以通过该节点进行搜索/索引。 实际上,当和时,我们将节点视为客户端节点,如果我设置了10个客户端节点,是否需要在客户端进行路由,这意味着如果我在代码 中将clientOne:9200 指定为ES门户,则 clientOne会 转发其他HTTP请求

  • 我尝试了以下命令- ,它给出了- 此CLI仅用于开发,不用于生产 https://docs.confluent.io/current/CLI/index.html 使用confluent_current:/tmp/confluent.w1s9b10m启动zookeeper zookeeper是[UP]启动kafka kafka是[UP] 启动schema-registry schema-regis

  • 问题内容: 如何为整个Eclipse项目设置java.library.path?我正在使用依赖于操作系统特定文件的Java库,并且需要找到.dll / .so / .jnilib。但是,应用程序始终会退出,并显示一条错误消息,指出在库路径中找不到这些文件。 我想将整个项目配置为使用库路径。我试图将路径作为VM参数添加到eclipse中的某些运行配置中,但这没有用。 问题答案: 不要弄乱图书馆的路径

  • 节能设置允许您通过更改 GPS 记录速率,关闭手腕型心率测量和使用屏幕保护程序,延长训练时间。这些设置可以优化电池使用率,并在超长训练课上或电池电量不足时获得更多训练时间。 节能设置可在快捷菜单中找到。您可在单项训练暂停期间,以及多项运动训练过渡模式期间,在训练准备模式下访问快捷菜单。在训练准备模式中,您可通过轻触 或使用 LIGHT(背光灯)按钮访问快捷菜单。在暂停和过渡模式中,仅可使用 LIG