(我正在使用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));
}
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();
}
}
直到这里一切顺利,当我按下下一个窗口中的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。我需要一个解决方案,而不是在第一个窗口中重新加载按钮。
答案 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()