Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解释为什么FXML对象为空_Java_Javafx - Fatal编程技术网

Java 解释为什么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?> <

我在代码中遇到了一个问题,即与控制器类的FXML文件相关的所有对象都是空的,即使FXML的样式正在工作,并且所有的fx:id标记都是相同的。以下是FXML代码:

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