如何打破按钮上的do-while循环

时间:2017-08-07 13:05:09

标签: button javafx do-while break

目前我遇到两个问题:

  1. 我试图找到一种方法来点击cancelButton后打破无限循环。单击按钮时我试图将变量标志设置为false,并在循环中将标志变量设置为条件,但我无法实现此目的。

  2. 第二个问题是。如何从此对话框窗口初始化两个单独的arraylist。例如,它返回一对字符串。我希望将值添加到ArrayLists的循环中。

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

2 个答案:

答案 0 :(得分:0)

无法正常工作

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

答案 1 :(得分:0)

欢迎使用Stackoverflow!

我认为do/while中所有方法的周围环境并不是一个好主意。在这种情况下,您每次都会创建包含所有元素的对话框。表现不佳。如果只循环显示对话框,会更好。

关于列表的第二个问题:您可以创建此类列表并填充转换器。在这种情况下,do/while可以简化为while,只检查结果显示:

    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
    }

替代解决方案,其中列表填充在do/while但没有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());