我无法在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。
有什么想法吗?
由于
答案 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
// ...
}
// ...
}