填充FXML中定义的Choicebox

时间:2014-04-14 18:16:31

标签: javafx fxml

我正在学习 javaFX ,我的问题是我有一个带有一些选择框和按钮的简单窗口。该窗口通过FXML定义,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>

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();
    }
}
}

谢谢你的帮助和时间

2 个答案:

答案 0 :(得分:2)

如何修复

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

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

发生了什么

onChangeCountClick中加载新的FXML:

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

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

    你接下来做的是(错误地)写:

    countChoiceBox = new ChoiceBox();
    

    你违反的经验法则是=&gt;永远不要使用new为标记为@FXML的成员创建值。


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

答案 1 :(得分:1)

@using FXML 第1步:在场景构建器中添加一个选择框并调用它(choiceBox) 步骤2:在控制器中添加以下代码     @FXML   私人ChoiceBox 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);

}