Java FXML需要从另一个窗口重新加载一个comboBox

时间:2017-04-03 19:57:52

标签: java fxml scenebuilder

(我正在使用Scene Builder)在我的控制器类中,我有一个Combobox,当我打开一个新窗口时,我用新项目填充框内的列表,当我关闭该窗口时,我需要组合框来改变,但是因为它不能是静态的我无法找到方法。

第一个窗口的控制器类(重要部分)

public void initialize(URL location, ResourceBundle resources) {

    readCharacters();
    for (Character character : characterList) {
        System.out.println(character);
    }
    characterBox.setValue("Chars");
    characterList.sort(Comparator.comparing(Character::getPowerLevel).reversed());
    characterBox.setItems(FXCollections.observableArrayList(characterList));


}

所以当我按下我的新按钮时,执行: enter image description here

public void addNewWindow() throws IOException {

    try {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("newWindow.fxml"));
        Parent root1 = (Parent) fxmlLoader.load();
        Stage stage = new Stage();
        stage.setScene(new Scene(root1));
        stage.show();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

这是从上面的代码打开的 This Opens from the above code

直到这里一切顺利,当我按下下一个窗口中的Add按钮时,这将从Controller2类执行:

public void addNewCharacter() {

    if (addNameField.getText().equals("") || xField.getText().equals("") || pField.getText().equals("")) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("Error");
        alert.setHeaderText(null);
        alert.setContentText("Please fill all fields");

        alert.showAndWait();
    } else {
        Controller.characterList.add(new Character(addNameField.getText(), Double.parseDouble(xField.getText()), Double.parseDouble(pField.getText()), specialButton.isSelected()));
        Controller.writeCharacters(); //this writes the characterList to a file for when i reopen the programm
    }
}

现在的问题是,当我完成原始窗口上的comboBox没有重新加载新条目时,我需要重新打开程序,以便使用新条目进行更新。那么我该如何解决这个问题,显然我无法使FXML字段保持静态。所以我无法找到一种方法将数据从Controller2发送到ComboBox到Controller。我需要一个解决方案,而不是在第一个窗口中重新加载按钮。

1 个答案:

答案 0 :(得分:0)

由于在初始化时将数据加载到ComboBox中,因此您不必惊讶地发现必须重新加载应用程序以查看新条目。这是一个建议:

首先在Controller上为第一个窗口创建一个新方法。使用适合更新ComboBox的输入参数进行公共访问,例如:

<input type="date" lang="en-au" /> 

然后从第二个控制器,使用FXMLLoader获取对第一个控制器的引用,如下所示:

public void addItem(Character c)
{
   // add your logic here to update the ComboBox collection of items
}

在动作事件处理程序代码中,必须是您的FXMLLoader loader = new FXMLLoader(getClass().getResource("YourFirstWindow.fxml")); FirstControllerClass firstController = loader.getController(); 方法,在第一个控制器上调用新方法:

addNewCharacter()