2017-04-03 53 views
0

(我正在使用場景生成器)在我的控制器類中,我有一個組合框,當我打開一個新窗口,並用新項目填充框中的列表時,當我關閉那個窗口我需要組合框來改變,但是因爲它不能是靜態的,所以我不能找出一個方法。對於第一個窗口Java FXML需要從另一個窗口重新加載組合框

控制器類(revelant部分)

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

打開

直到這裏一切順利,當我在下一個窗口按下添加按鈕t他從控制器2類執行:

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。我需要一個解決方案,而不是在第一個窗口中創建一個重新加載按鈕。

回答

0

由於將數據加載到ComboBox會在初始化時發生,因此我不驚訝您發現必須重新加載應用程序才能看到新條目。這裏有一個建議:

首先在Controller的第一個窗口上創建一個新的方法。使公共接入,適當的更新您的組合框輸入參數,如:

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); 
相關問題