【问题标题】:Java FXML need to reload a comboBox from another windowJava FXML 需要从另一个窗口重新加载一个组合框
【发布时间】:2017-08-28 19:51:36
【问题描述】:

(我正在使用 Scene Builder)在我的控制器类中,我有一个组合框,当我打开一个新窗口并用新项目填充框内的列表时,当我关闭该窗口时,我需要更改组合框,但是因为它不能是静态的,所以我想不出办法。

第一个窗口的控制器类(相关部分)

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


}

所以当我按下我的新建按钮时,它会执行:

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

}

这从上面的代码打开

到目前为止一切都很好,当我在下一个窗口中按下添加按钮时,它将从 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
    }
}

现在的问题是,当我完成后,原始窗口上的组合框不会重新加载新条目,我需要重新打开程序才能使用新条目对其进行更新。那么我该如何解决这个问题,显然我无法将 FXML 字段设为静态。所以我想不出一种方法将数据从Controller2发送到ComboBox到Controller。除了在第一个窗口中制作重新加载按钮之外,我还需要一个解决方案。

【问题讨论】:

    标签: java fxml scenebuilder


    【解决方案1】:

    由于在初始化时将数据加载到您的 ComboBox 中,因此您发现必须重新加载应用程序才能看到新条目,我并不感到惊讶。这里有一个建议:

    首先在控制器上为您的第一个窗口创建一个新方法。使其可公开访问,并使用适合更新 ComboBox 的输入参数,例如:

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

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

    FXMLLoader loader = new FXMLLoader(getClass().getResource("YourFirstWindow.fxml"));
    FirstControllerClass firstController = loader.getController();
    

    在动作事件处理程序代码中,它必须是您的addNewCharacter() 方法,在您的第一个控制器上调用新方法:

    Character myNewCharacter = new Character(addNameField.getText(), Double.parseDouble(xField.getText()), Double.parseDouble(pField.getText()), specialButton.isSelected());
    Controller.characterList.add(myNewCharacter);
    Controller.writeCharacters();
    firstController.addItem(myNewCharacter);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多