Javafx 填充FXML中定义的Choicebox

Javafx 填充FXML中定义的Choicebox,javafx,fxml,Javafx,Fxml,我正在学习javaFX,我的问题是我有一个带有选择框和按钮的简单窗口。此窗口通过FXML定义,FXML也与控制器类关联。 我想知道如何使用controller类中的数据填充此choicebox,因为使用@FXML引用此choicebox会引发NullPointerException 编辑-添加源代码 FXML代码 <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-I

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

编辑-添加源代码 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>

感谢您的帮助和时间

如何修复它

删除行
countChoiceBox=new ChoiceBox()和所有内容都可以正常工作

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

发生了什么事

onChangeCount中加载新的FXML单击将:

  • 创建一个新的
    超市.ManageWindowCC
    控制器
  • 根据FXML定义创建节点层次结构
  • 层次结构中的一个节点将是ChoiceBox
  • FXML加载程序自动为您创建的ChoiceBox将分配给countChoiceBox成员
  • 然后获取指定给root的节点层次,并将其添加到新舞台上的新场景中
  • 因此,加载FXML后,countChoiceBox被初始化为FXML加载程序实例化的空ChoiceBox

    到目前为止一切都很好

    然后你会(错误地)写下:

    您违反的经验法则是=>永远不要使用
    new
    创建一个属性,为标记为
    @FXML
    的成员赋值


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

    @使用FXML 步骤1:在场景生成器中添加一个选择框,并将其称为“可能”(choiceBox) 步骤2:在控制器中添加以下代码 @FXML 私人选择箱选择箱

    @Override
    public void initialize(URL url, ResourceBundle rb) {
     ObservableList<String> list = FXCollections.observableArrayList();
       list.addAll("choice1", "choice2","choice3");
      //populate the Choicebox;  
      choiceBox .setItems(list);
    
    }
    
    @覆盖
    公共void初始化(URL、ResourceBundle rb){
    ObservableList=FXCollections.observableArrayList();
    列表。添加所有(“选项1”、“选项2”、“选项3”);
    //填充Choicebox;
    choiceBox.setItems(列表);
    }
    
    请编辑您的问题并添加一些代码,例如fxml和Controller类,您在其中引用了Choicebox。感谢您非常聪明的解释。现在我知道这个代码应该可以工作了。异常仍然存在,但正如您所提到的,在控制器类的其余部分中必须存在一些其他错误。我还不了解windows之间的所有机制和关系。更具体地说:此窗口应在单击另一个阶段中的按钮后显示,但这些阶段共享相同的
    ManageWindowCC
    控制器。Som可能这就是空指针的原因一般来说,如果你创建了一个包含完整的独立代码的系统,有人可以编译并执行它而无需修改,这是获得帮助和确保您的程序按预期运行的有效方法。过去几个小时我在搜索stackowerflow,我发现您的专业答案您是最好的。我终于明白了如何在控制器之间传递参数非常感谢:)
    countChoiceBox = new ChoiceBox();
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
     ObservableList<String> list = FXCollections.observableArrayList();
       list.addAll("choice1", "choice2","choice3");
      //populate the Choicebox;  
      choiceBox .setItems(list);
    
    }