2017-08-07 5 views
0

上のループは、現在、私はこの場合には二つの問題があります。cancelButtonがクリックされた後、無限ループを破る方法を見つけようとして破るためにどのように-ながらボタン

  1. イム。ボタンをクリックしてフラグ変数をループの条件として設定すると、変数フラグをfalseに設定しようとしていましたが、これを達成できません。

  2. 第2の問題点は、このダイアログウィンドウから2つの別々のarraylistを初期化する方法。例では、Stringのペアを返します。値をループで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); 
    

答えて

0

Welcome to Stackoverflow!

私はすべての方法の周囲がdo/whileにあると思います。この場合、毎回すべての要素でダイアログを作成します。パフォーマンスが悪いダイアログの表示のみをループする方が良いでしょう。

リストについての2番目の質問について:あなたはそのようなリストを作成してコンバーターに移入することができます。この場合、do/whileは、結果だけを提示するためのチェックでwhileに簡素化することができます。リストはdo/whileではなく、flagずに移入され

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 
    } 

代替ソリューションは:

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

おかげで、それは私の問題を解決しました! –

0

それは

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

を行うには動作しませんか?

関連する問題