2017-08-07 3 views
0

Zur Zeit habe ich zwei Probleme mit diesem Fall:Wie zu brechen do-while-Schleife auf der Schaltfläche

  1. Im Versuch, einen Weg zu finden, die unendliche Schleife zu brechen nach cancelButton geklickt wird. Ich habe versucht, das Variablenflag auf false zu setzen, wenn auf die Schaltfläche geklickt wird, und setze die Flagvariable als Bedingung in der Schleife, aber das kann ich nicht erreichen.

  2. Die zweite Ausgabe ist. So initialisieren Sie zwei separate Arraylisten aus diesem Dialogfenster. Zum Beispiel gibt es ein Paar Strings zurück. Ich möchte, dass die Werte in einer Schleife zu einem ArrayLists hinzugefügt werden.

    import javafx.application.Platform; 
    import javafx.event.ActionEvent; 
    import javafx.geometry.Insets; 
    import javafx.scene.Node; 
    import javafx.scene.control.*; 
    import javafx.scene.layout.GridPane; 
    import javafx.util.Pair; 
    import javafx.scene.control.Label; 
    
    
    import java.util.*; 
    
    public class Controller { 
    public void pick (ActionEvent event) { 
    
    
    boolean flag = true; 
    
    do { 
    
    
        // Create the custom dialog. 
        Dialog<Pair<String, String>> dialog = new Dialog<>(); 
        dialog.setTitle("Login Dialog"); 
        dialog.setHeaderText("Look, a Custom Login Dialog"); 
    
    
        //Set the button types. 
        ButtonType dalejButtonType = new ButtonType("Dalej", ButtonBar.ButtonData.OK_DONE); 
        ButtonType cancelButton = new ButtonType("Cancel", ButtonBar.ButtonData.CANCEL_CLOSE); 
        dialog.getDialogPane().getButtonTypes().addAll(dalejButtonType, cancelButton); 
    
    
        // Create the username and password labels and fields. 
        GridPane grid = new GridPane(); 
        grid.setHgap(10); 
        grid.setVgap(10); 
        grid.setPadding(new Insets(20, 150, 10, 10)); 
    
        TextField imie = new TextField(); 
        imie.setPromptText("Imię"); 
        TextField email = new TextField(); 
        email.setPromptText("eMail"); 
    
        grid.add(new Label("Imię:"), 0, 0); 
        grid.add(imie, 1, 0); 
        grid.add(new Label("eMail:"), 0, 1); 
        grid.add(email, 1, 1); 
    
        // Enable/Disable login button depending on whether a username was entered. 
        Node loginButton = dialog.getDialogPane().lookupButton(dalejButtonType); 
        loginButton.setDisable(true); 
    
        // Do some validation (using the Java 8 lambda syntax). 
        imie.textProperty().addListener((observable, oldValue, newValue) -> { 
         loginButton.setDisable(newValue.trim().isEmpty()); 
        }); 
    
        dialog.getDialogPane().setContent(grid); 
    
        // Request focus on the username field by default. 
        Platform.runLater(() -> imie.requestFocus()); 
    
        // Convert the result to a username-password-pair when the login button is clicked. 
        dialog.setResultConverter(dialogButton -> { 
         if (dialogButton == dalejButtonType) { 
          return new Pair<>(imie.getText(), email.getText()); 
         } 
    
    
         return null; 
    
    
        }); 
    
    
        Optional<Pair<String, String>> result = dialog.showAndWait(); 
    
    
    } while(flag); 
    

Antwort

0

Willkommen bei Stackoverflow!

Ich denke, die Umgebung aller Methode in do/while ist keine gute Idee. In diesem Fall erstellen Sie jedes Mal den Dialog mit allen Elementen. Nicht gut für die Leistung. Ist besser, wenn Sie nur die Anzeige des Dialogs in loop machen.

Über die zweite Frage über Listen: Sie können solche Listen erstellen und im Konverter auffüllen.

final List<String> names = new ArrayList<>(); 
    final List<String> emails = new ArrayList<>(); 

    // Convert the result to a username-password-pair when the login button is clicked. 
    dialog.setResultConverter(dialogButton -> { 
     if (dialogButton == dalejButtonType) { 
      names.add(imie.getText()); 
      emails.add(email.getText()); 
      return new Pair<>(imie.getText(), email.getText()); 
     } 

     return null; 
    }); 

    while(dialog.showAndWait().isPresent()) { 
     // do additional something if needed 
    } 

Eine alternative Lösung, bei der die Listen aufgefüllt werden in do/while aber ohne flag:

Optional<Pair<String, String>> result; 
    do{ 
     result = dialog.showAndWait(); 

     if (result.isPresent()) { 
      names.add(result.get().getKey()); 
      emails.add(result.get().getValue()); 
     } 
    } while(result.isPresent()); 
+0

Danke, es gelöst mein Problem in diesem Fall do/while kann mit der Überprüfung nur für Ergebnis präsentierenden zu while vereinfacht werden! –

0

Ist es nicht

if (result.isPresent()) { 
    Pair<String, String> values = result.get(); 
    // add values to list 
} else { 
    flag = false ; 
} 

viel zu tun?

Verwandte Themen