Java 解释为什么FXML对象为空
我在代码中遇到了一个问题,即与控制器类的FXML文件相关的所有对象都是空的,即使FXML的样式正在工作,并且所有的fx:id标记都是相同的。以下是FXML代码:Java 解释为什么FXML对象为空,java,javafx,Java,Javafx,我在代码中遇到了一个问题,即与控制器类的FXML文件相关的所有对象都是空的,即使FXML的样式正在工作,并且所有的fx:id标记都是相同的。以下是FXML代码: <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.geometry.Insets?> <
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<VBox xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
alignment="center"
spacing="10"
prefHeight="750"
prefWidth="1000"
style="-fx-background-color: lightslategray">
<padding><Insets top="0" bottom="10" left="10" right="10"></Insets></padding> <!-- Set the padding at 10px for each side of the window -->
<Label fx:id="titleLabel" style="-fx-font-weight: bold; -fx-font-size: 32;" wrapText="true" text="Deck Title"/>
<HBox spacing="10">
<Button fx:id="backButton" text="Back" prefWidth="50"/>
<ProgressBar fx:id="progressIndicator" GridPane.columnIndex="0" GridPane.rowIndex="0" prefWidth="920" progress="0.0"/>
</HBox>
<HBox spacing="20">
<Label fx:id="qLabel" style="-fx-background-color: white; -fx-border-color: black" prefWidth="480" prefHeight="400" wrapText="true"/>
<Label fx:id="aLabel" style="-fx-background-color: white; -fx-border-color: black; -fx-cursor: hand" prefWidth="480" prefHeight="400" wrapText="true" text="Click here to reveal the answer" onMouseClicked="#updateAnswer"/>
</HBox>
<HBox spacing="780">
<Button fx:id="incorrectButton" text="Incorrect" prefWidth="100"/>
<Button fx:id="correctButton" text="Correct" prefWidth="100"/>
</HBox>
</VBox>
我必须从FXML文件中删除属性fx:controller=“flashcardApplication.openCardsController
,并且必须用以下行替换行Parent root=fxmloader.load(getClass().getResource(“./mainPage.FXML”);
:
File file = new File(System.getProperty("user.dir") + "/src/flashcardApplication/openCardsPage.fxml");
FXMLLoader loader = new FXMLLoader(file.toURI().toURL());
loader.setController(this);
请有人解释为什么我必须使用不同的解决方案,因为我在另外两个FXML文件及其相应的控制器类中使用了单行解决方案,没有任何问题。加载FXML时,
@FXML
-注释字段在控制器中初始化。默认情况下,FXMLLoader
创建n由fx:controller
属性指定的类的实例,并将其用作控制器
因此,在原始代码中,控制器不是OpenCardsController
的当前实例,该实例上的openCards()正在调用
,但它是同一类的新实例。因此,@FXML
-注释字段不是在当前实例中初始化的,而是在由fxmloader
创建的新实例中初始化的
通过删除fx:controller
属性,并将控制器显式设置为所需的确切对象(OpenCardsController的当前实例),您可以实现所需的功能:控制器现在是当前实例,FXML
注释字段在该对象中初始化
请注意,从控制器本身加载FXML文件有点不寻常。典型的方法是从其他代码加载FXML,并显示生成的UI;控制器通常是一个单独的对象。它可能更自然(并且更易于长期维护)如果您重构代码,以便从其他地方加载FXML(这实际上是一个关注点与单一责任分离的问题:控制器应该只负责处理来自相应FXML文件的用户输入;它不应该也负责加载FXML)非主题:不要使用
文件指定FXML的位置。如果(当)将应用程序捆绑为jar文件,则会中断此操作。(无论如何,您当然不应该从源文件夹加载。)使用资源:URL FXML=getClass().getResource(“openCardsPage.FXML”);
File file = new File(System.getProperty("user.dir") + "/src/flashcardApplication/openCardsPage.fxml");
FXMLLoader loader = new FXMLLoader(file.toURI().toURL());
loader.setController(this);