2017-09-22 1 views
0

J'essaie de créer une interface utilisateur qui obtient des nombres à partir de champs de texte qui ont été ajoutés en appuyant sur un bouton, ajoute les nombres, puis imprime la console. J'ai compris comment ajouter des champs de texte dans un nombre infini, mais je n'arrive pas à obtenir tous les nombres de chaque champ de texte et à imprimer la somme. Chaque fois que je mets des chiffres dans mon champ de texte et que j'appuie sur le bouton «Ajouter des numéros», cela ne fait que renvoyer le nombre dans le dernier champ de texte ajouté. Voici mon code:Comment ajouter plusieurs champs de texte à une arborescence JavaFX

public VBox pane; 
@FXML 
private Button addButton; 

@FXML 
private TextField field; 

@FXML 
private void addNewTextField(ActionEvent event) { 
    field = new TextField(); 

    field.textProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
      if (!newValue.matches("\\d*")) { 
       field.setText(newValue.replaceAll("[^\\d]", "")); 
      } 
     } 
    }); 

    pane.getChildren().add(field); 

} 

@FXML 
private void addNumbers(ActionEvent e) { 

    ArrayList<Integer> numList = new ArrayList<>(); 

    try { 
     ArrayList<Integer> list = new ArrayList<>(); 

     int result = Integer.parseInt(field.getText()); 

     list.add(result); 



     int sum = 0; 
     for (int i : list) { 
      sum += result; 
      System.out.println("The sum of numbers is = " + sum); 
     } 

    } catch (NumberFormatException exception) { 
     exception.printStackTrace(); 
    } 
} 

}

+0

Faites de 'field' une variable locale au lieu d'un champ d'instance. –

+0

Donc, faites de champ une variable publique – koory

+0

Si votre 'Pane' avec le' TextField's ont seulement 'TextField's, alors vous devez utiliser ce' Pane' pour récupérer le 'TextField's. Utilisez 'pane.getChildren()' dans votre méthode 'addNumber (..)'. – Sedrick

Répondre

1

Dans ce cas, le champ ne doit pas être une variable d'instance du tout, donc il ne devrait pas être annotés @FXML et devrait plutôt être déclarée dans votre méthode.

Si vous ne savez pas ce qu'est une variable locale et en quoi elle diffère d'une variable d'instance, lisez ceci tutorial on local variables.

Enlevez ces lignes:

@FXML 
private TextField field; 

Modifier le corps de méthode:

private void addNewTextField(ActionEvent event) { 
    TextField field = new TextField(); 
    . . . 
} 

En plus: Vous ne devriez jamais définir une variable annotée @FXML à une nouvelle valeur (une référence sera injectée par le FXMLLoader, et cela ne devrait pas être réaffecté par le programmeur d'application).