我正在学习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();
}
}
}
感谢您的帮助和时间
如何修复它
删除行countChoiceBox = new ChoiceBox();
,一切都会正常工作,假设您的应用程序中没有其他错误。
程序将使用对countChoiceBox的引用,该引用是FXMLLoader创建的节点层次结构的一部分,并在场景中设置。
发生了什么
在onChangeCountClick
中加载新的FXML将:
- 创建一个新的
supermarket.ManageWindowCC
控制器 - 基于FXML定义创建节点层次结构
- 层次结构中的一个节点将是ChoiceBox
- FXML加载程序自动为您创建的ChoiceBox将分配给countChoiceBox成员
- 然后,将指定给根节点的层次结构添加到新舞台上的新场景中
因此,在您加载FXML之后,countChoiceBox被初始化为一个由您的FXMLLoader 实例化的空ChoiceBox
到目前为止一切都很好。
然后你做的是(错误地)写:
countChoiceBox = new ChoiceBox();
你违反的经验法则是=>永远不要使用CCD_ 5为标记为CCD_。
另请参阅使用FXML填充组合框的相关示例(尽管该示例使用组合框并直接在FXML中填充其数据,因此它不直接适用于您的情况)。
@使用FXML步骤1:在场景生成器中添加一个选择框,并将其称为maybe(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);
}