2017-04-03 2 views
0

(J'utilise Scene Builder) Dans ma classe de contrôleur j'ai un Combobox, quand j'ouvre une nouvelle fenêtre et je remplis la liste dans la boîte avec de nouveaux éléments, quand je ferme cette fenêtre j'ai besoin de la combobox pour changer, mais comme il ne peut pas être statique, je ne peux pas trouver un moyen.Java FXML besoin de recharger une comboBox à partir d'une autre fenêtre

classe contrôleur pour la première fenêtre (pièces 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)); 


} 

Alors, quand je presse mon bouton Nouveau Exécute: 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(); 
    } 

} 

Cela ouvre du code ci-dessus This Opens from the above code

Jusqu'à ici tout va bien, quand j'appuie sur le bouton Ajouter dans la fenêtre suivante t de la classe ses exécute 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 
    } 
} 

Maintenant, le problème est que quand je suis fait la comboBox sur la fenêtre d'origine ne sont rechargées la nouvelle entrée, je dois rouvrir le programme pour qu'il soit mis à jour avec la nouvelle entrée. Alors, comment puis-je résoudre cela, apparemment je ne peux pas faire un champ FXML statique. Donc, je ne peux pas trouver un moyen d'envoyer des données à la ComboBox de Controller2 à Controller. J'ai besoin d'une solution autre que de faire un bouton de rechargement dans la première fenêtre.

Répondre

0

Depuis le chargement des données dans votre ComboBox arrive à l'initialisation, je ne suis pas surpris que vous trouviez que vous devez recharger l'application pour voir les nouvelles entrées. Voici une suggestion:

Commencez par créer une nouvelle méthode sur le contrôleur pour votre première fenêtre. Faites-accès public, avec des paramètres d'entrée appropriés pour la mise à jour de votre ComboBox, telles que:

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

Ensuite, à partir de votre deuxième contrôleur, utilisez le FXMLLoader pour obtenir une référence au premier, quelque chose comme ceci:

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

Et dans le code du gestionnaire d'événements d'action, qui doit être votre méthode addNewCharacter(), appelez la nouvelle méthode sur votre premier contrôleur:

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