JavaFX无法在运行时使用ID查找FXML中声明的节点

时间:2015-01-27 02:37:24

标签: javafx fxml

我无法在FXML中找到id为“#mainScrollPaneVbox”的节点“VBox”。

这是我的FXML:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.conuretech.video_assembler.FXMLController">
   <top>
      <MenuBar prefHeight="16.0" prefWidth="600.0" BorderPane.alignment="CENTER">
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
              <MenuItem mnemonicParsing="false" onAction="#handleNewAction" text="New" />
              <MenuItem mnemonicParsing="false" onAction="#handleOpenProjectAction" text="Open Project" />
              <MenuItem mnemonicParsing="false" onAction="#handleSaveAsAction" text="Save As..." />
              <MenuItem mnemonicParsing="false" onAction="#handleSaveAction" text="Save..." />
              <MenuItem mnemonicParsing="false" onAction="#handleCovertImagesToVideoAction" text="Convert Project To video" />
              <MenuItem mnemonicParsing="false" onAction="#handleImportLocalAction" text="Import Local Images" />
              <MenuItem mnemonicParsing="false" onAction="#handleImportRemoteAction" text="Import Remote Images" />
              <MenuItem mnemonicParsing="false" onAction="#handleExitAction" text="Exit" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Edit">
            <items>
              <MenuItem mnemonicParsing="false" text="Add New Frame From" />
               <MenuItem mnemonicParsing="false" text="Delete Current Frame" />
               <MenuItem mnemonicParsing="false" text="Edit Frame Properties" />
               <MenuItem mnemonicParsing="false" text="Video Properties" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Help">
            <items>
              <MenuItem mnemonicParsing="false" text="About" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
   </top>
   <left>
      <ScrollPane id="#mainScrollPane" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
         <content>
            <VBox id="#mainScrollPaneVbox" prefHeight="200.0" prefWidth="200.0" />
         </content></ScrollPane>
   </left>
   <center>
      <GridPane BorderPane.alignment="CENTER">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
      </GridPane>
   </center>
</BorderPane>

以下是Java代码,它试图在运行时找到“Vbox”:

VBox vbox = (VBox) MainApp.scene.lookup("#mainScrollPaneVbox");

我也尝试过:

VBox vbox = (VBox) MainApp.scene.lookup("mainScrollPaneVbox");

但是仍然会返回null。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:1)

为什么您的代码不起作用

FXML中的id属性应该只包含节点的id,而不是id的CSS查找。换句话说,你有

<VBox id="#mainScrollPaneVbox" ... >

何时需要

<VBox id="mainScrollPaneVbox" ... >

查找应该有CSS查找:

VBox vbox = (VBox) MainApp.scene.lookup("#mainScrollPaneVbox");

但我不建议以这种方式做事,特别是因为你已经有了一个控制器类。

推荐方法

CSS查找不是很健壮。它们依赖于String绑定,并且不是类型安全的。此外,在实际执行查找之前不会捕获任何错误,这可能在应用程序启动之后(例如,当用户执行某些操作时)。

更好的方法是使用@FXML注射。虽然这些仍然依赖于String绑定,并且没有编译时类型检查,但是在加载FXML文件时会捕获错误,因此任何故障都会更早发生。这使得检测和修复错误变得更加容易。

使用@FXML注射你会做

<VBox fx:id="mainScrollPaneVbox"

然后在你的控制器类中:

public class FXMLController {

    @FXML
    private VBox mainScrollPaneVbox ; // same field name as the fx:id

    // ...

    public void initialize() {
        // popuplate mainScrollPaneVbox ...
        // can similarly be accessed in event handlers

        // ...
    }

    // ...
}
相关问题