填充 FXML 中定义的选择框

use*_*486 5 javafx fxml

我正在学习javaFX,我的问题是我有一些带有选择框和按钮的简单窗口。这个窗口是通过 FXML 定义的,它也与控制器类相关联。我想知道,如何用控制器类中的数据填充这个选择框,因为使用@FXML 引用这个选择框会抛出NullpointerEception

编辑 - 添加源代码 FXML 代码

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="240.0"
        prefWidth="320.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
        fx:controller="supermarket.ManageWindowCC">
<children>
    <ChoiceBox fx:id="countChoiceBox" layoutX="44.0" layoutY="71.0" prefHeight="25.0" prefWidth="191.0"/>
    <Label layoutX="44.0" layoutY="54.0" text="To change item's count, choose one"/>
    <TextField layoutX="140.0" layoutY="129.0" prefHeight="25.0" prefWidth="24.0"/>
    <Label layoutX="123.0" layoutY="112.0" text="New count"/>
    <Button layoutX="126.1875" layoutY="171.5" mnemonicParsing="false" text="Submit"/>
</children>
Run Code Online (Sandbox Code Playgroud)

Java控制器代码:

public class ManageWindowCC {
@FXML
private ChoiceBox countChoiceBox;

public void onChangeCountClick(ActionEvent actionEvent) {

    try {
        Parent root = FXMLLoader.load(getClass().getResource("ChangeCount.fxml"));
        Stage newStage = new Stage();
        newStage.setTitle("Change item's count");
        newStage.setScene(new Scene(root, 320, 240));
        newStage.show();
        countChoiceBox = new ChoiceBox();
        countChoiceBox.setItems(FXCollections.observableArrayList("One","Two","Three"));

    } catch (IOException e) {
        e.printStackTrace();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助和时间

jew*_*sea 2

如何修复它

删除该行countChoiceBox = new ChoiceBox();,一切都会正常工作,假设您的应用程序中其他地方没有其他错误。

该程序将使用对 countChoiceBox 的引用,该引用是由 FXMLLoader 创建并在场景中设置的节点层次结构的一部分。

怎么了

在 will 中加载新的 FXML onChangeCountClick

  1. 创建一个新supermarket.ManageWindowCC控制器。
  2. 根据 FXML 定义创建节点层次结构。
  3. 层次结构中的节点之一将是 ChoiceBox。
  4. FXML 加载程序自动为您创建的ChoiceBox将被分配给 countChoiceBox 成员。
  5. 然后,您将分配给根的节点层次结构添加到新舞台上的新场景中。

因此,加载 FXML 后,countChoiceBox 被初始化为由 FXMLLoader 实例化的空 ChoiceBox

到目前为止一切都很好。。。

然后你做的是(错误地)写:

countChoiceBox = new ChoiceBox();
Run Code Online (Sandbox Code Playgroud)

您违反的经验法则是 => 永远不要使用new为标记为 的成员分配值@FXML


另请参阅使用 FXML 填充 ComboBox 的相关示例(尽管该示例使用 ComboBox 并直接在 FXML 中填充其数据,因此它并不直接适用于您的情况)。