2017-06-15 3 views
1

Je crée une application dans JavaFX où je crée deux GridPanes dynimically avec même nombre de lignes, les deux GridPanes ont textfields et au-dessous il y a un bouton comme ceci:JavaFX: Comment calculer la moyenne à partir des valeurs de TextField créées dynamiquement dans GridPane?

enter image description here

utilisateur peut écrire un nombre dans GridPane a LIKE de TextFields créées dynamiquement ceci:

enter image description here

ce que je veux est lorsque l'utilisateur pressera programme bouton Soumettre doit calculer la somme des valeurs présentes dans chaque ligne, puis diviser chaque ro w somme calculée avec la somme de l'ensemble GridPane TextFields et afficher le résultat dans les TextFields de deuxième GridPane selon GridPane une position de ligne par exemple GridPane Une rangée 0 résultat du calcul doit être affichée dans GridPane B ligne 0 comme suit:

enter image description here

I » m créer GridPane comme ceci GridPane A:

public static GridPane tableA(int rows, Button button){ 
    GridPane table = new GridPane(); 

    rowValidationBindings = new BooleanBinding[rows]; 

    for(int i=0; i<rows; i++){ 
     TextField textField1 = new TextField(); 
     textField1.setAlignment(Pos.CENTER); 
     TextField textField2 = new TextField(); 
     textField2.setAlignment(Pos.CENTER); 
     TextField textField3 = new TextField(); 
     textField3.setAlignment(Pos.CENTER); 

     rowValidationBindings[i] = Bindings.createBooleanBinding(
      () -> { 
       if (textField1.getText().matches("\\d+") && 
        textField2.getText().matches("\\d+") && 
        textField1.getText().matches("\\d+") { 
        return true ; 
       } else { 
        return false ; 
       } 
      }, textField1.textProperty(), textField2.textProperty(), textField3.textProperty() 
     ); 

     table.add(textField1, 0, i+1); 
     table.add(textField2, 1, i+1); 
     table.add(textField3, 2, i+1); 
    } 

    button.disableProperty().bind(Bindings.createBooleanBinding(
     () -> ! Stream.of(rowValidationBindings).allMatch(BooleanBinding::get), 
     rowValidationBindings 
    )); 

    return table; 
} 

GridPane B

public static GridPane tableB(int rows, Button button){ 
    GridPane table = new GridPane(); 

    rowValidationBindings = new BooleanBinding[rows]; 

    for(int i=0; i<rows; i++){ 
     TextField textField1 = new TextField(); 
     textField1.setAlignment(Pos.CENTER); 

     rowValidationBindings[i] = Bindings.createBooleanBinding(
      () -> { 
       if (textField1.getText().matches("\\d+") { 
        return true ; 
       } else { 
        return false ; 
       } 
      }, textField1.textProperty() 
     ); 

     table.add(textField1, 0, i+1); 
    } 

    button.disableProperty().bind(Bindings.createBooleanBinding(
    () -> ! Stream.of(rowValidationBindings).allMatch(BooleanBinding::get), 
    rowValidationBindings 
)); 
    return table; 
} 

Méthode t o retour composante de la table à la ligne spécifique et de la colonne:

public static Node getComponent (int row, int column, GridPane table) { 
     for (Node component : table.getChildren()) { // loop through every node in the table 
      if(GridPane.getRowIndex(component) == row && 
          GridPane.getColumnIndex(component) == column) { 
       return component; 
      } 
     } 

     return null; 
    } 

Bouton mise en œuvre Click:

@FXML 
    private void calcul() { 
     GridPane table = (GridPane) anchorPane.getChildren().get(0); 
     for(int i=1 ; i<=comboxBox.getValue(); i++){ 
      String text0 = ((TextField) getComponent (i, 0, table)).getText(); 
      String text1 = ((TextField) getComponent (i, 1, table)).getText(); 
      String text2 = ((TextField) getComponent (i, 2, table)).getText(); 

       System.out.println(text0 + " " + text1 + " " + text2); 
       System.out.println("Next Row"); 

    } 
+1

Nous sommes clairement ce que vous avez besoin, mais Je ne pense pas que vous nous avez dit quel est le problème ... – Jai

+0

Je suis assez sûr que cela a été répondu il y a quelques jours. – Sedrick

+0

@SedrickJefferson Si vous avez déjà répondu, pouvez-vous marquer ici la question déjà posée? – Junaid

Répondre

1

Je pense que votre approche est la bonne façon d'y parvenir, vous pouvez essayer cela, lorsque le bouton est cliqué (c'est-à-dire l'enveloppe avec son écouteur d'action) (NB. Non testé):

// pass the numberOfRows which is comboxBox.getValue() 
// pass tableA and tableB. 
// fetch the numbers (in a String format) from all TextFields at every row in tableA 
// and caclulate the result after parsing the Strings from each as double values 
// set the result in the corresponding TextField in tableB in every loop 
private void calcul(GridePane tableA, GridPane tableB, int numberOfRows) { 
    double result = 0; 
    for(int i=0 ; i<numberOfRows; i++){ 
     result = (Double.parseDouble(((TextField) getComponent (i, 0, tableA)).getText()) + 
        Double.parseDouble(((TextField) getComponent (i, 1, tableA)).getText()) + 
        Double.parseDouble(((TextField) getComponent (i, 2, tableA)).getText())) 
              /(numberOfRows*3); 

     ((TextField) getComponent (i, 0, tableB)).setText(String.valueOf(result)); 

    } 
} 

MISE À JOUR

Après OP a fourni plus d'explications dans les commentaires ci-dessous, quelques ajustements du code ci-dessus doit:

// pass the numberOfRows which is comboxBox.getValue() 
// pass tableA and tableB. 
private void calcul(GridePane tableA, GridPane tableB, int numberOfRows) { 
    // first get the total and store it in a variable 
    double total =0; 
    for(Node node : tableA){ 
     if(node instanceof TextField){ 
     total += Double.parseDouble(((TextField)node).getText()); 
     } 
    } 

    // fetch the numbers (in a String format) from all TextFields at every row in tableA 
    // and calculate the average after parsing the Strings from each as double values 
    // set the average in the corresponding TextField in tableB in every loop 
    double average = 0; 
    for(int i=0 ; i<numberOfRows; i++){ 
     average = (Double.parseDouble(((TextField) getComponent (i, 0, tableA)).getText()) + 
        Double.parseDouble(((TextField) getComponent (i, 1, tableA)).getText()) + 
        Double.parseDouble(((TextField) getComponent (i, 2, tableA)).getText())) 
             /(total); 

     ((TextField) getComponent (i, 0, tableB)).setText(String.valueOf(average)); 

    } 
} 
+0

Merci @Yahya pour votre réponse, mais Je pense que je n'ai pas expliqué ma question clairement. Je vais essayer d'expliquer à nouveau, 1er: Je veux calculer la somme rangée par rangée si vous voyez la capture d'écran 2, dans la rangée 1 il y a trois valeurs: 1,0,0 donc la somme de la ligne 1 sera 1 + 0 + 0 = 1, la rangée 2 sera 1 + 4 + 0 = 5, la rangée 3 sera 2 + 0 + 1 = 3, la rangée 4 sera 1 + 1 + 2 = 4. 2ème: Je veux est de calculer des valeurs de somme totale dans GridPane TextFields comme selon la capture d'écran la somme totale sera 1 + 0 + 0 + 1 + 4 + 0 + 2 + 0 + 1 + 1 + 1 + 2 = 13. Continuer dans le commentaire suivant: – Junaid

+0

3ème: Je veux calculer la moyenne de chaque somme de ligne avec somme totale comme ligne 1 moyenne sera rangée1 moyenne: ligne 1 somme/somme totale soit row1 moyenne: = 1/13, rangée 2 moyenne: 5/13, rangée 3 moyenne: 3/13, rangée 4 moyenne 4/13.4ème: Comme vous pouvez le remarquer dans la capture d'écran 3, je veux afficher chaque moyenne dans GridPane B textFields comme GridPane Un affichage de résultat av1 row1 dans GridPane B row1, GridPane Un affichage de résultat av2 row dans GridPane B row2, GridPane Un affichage de résultat moy3 row dans GridPane B row3, GridPane Affichage d'un résultat avg row4 dans GridPane B row4. J'espère que cette fois, mon explication est claire. – Junaid

+0

@Junaid Après avoir lu les commentaires, je pense que très peu d'ajustements du code ci-dessus a besoin. J'ai mis à jour ma réponse. Vérifie-le maintenant. – Yahya