如何修复“ JavaFX对话框接受用户输入”问题

时间:2019-04-04 17:17:08

标签: javafx dialog iteration

enter image description here我正在创建一个JavaFx对话框,并且在很大程度上编写了代码。我的问题是,如果用户输入无效的输入,如何显示错误消息。我知道我必须在某个地方使用while循环,但是由于JavaFx对话框的结构,我不确定在哪里。第二个问题是,如果用户输入正确的输入,如果是,请说1,我想调用一个函数来执行任务。

我编写的代码将弹出一个弹出框,并将用户输入到控制台的结果打印出来。

    public static void AnotherMatch() { 
//creates a popUp window
Stage popUp = new Stage();

// makes sure no changes are made in the Main window while this window is open
popUp.initModality(Modality.APPLICATION_MODAL);
popUp.setTitle("New Game");
popUp.setMinWidth(400);
popUp.setHeight(200);

TextPanel textPanel2 = new TextPanel();
TextField nameInput = new TextField();
Button button = new Button("Enter");


//label explains how the game works
Label displayLabel = new Label();

displayLabel.setText("Do you want to play another match: Yes: 1 -- No: 2");

button.setOnAction(e -> isChoice(nameInput, nameInput.getText()));

//vbox stores label and is set in centre
VBox windowDisplay = new VBox();
windowDisplay.setStyle("-fx-background-color:Wheat"); //background colour is set
windowDisplay.getChildren().addAll(displayLabel,nameInput, button);

windowDisplay.setAlignment(Pos.CENTER);

Scene scene = new Scene(windowDisplay);
popUp.setScene(scene);
popUp.showAndWait();    } 

isChoice函数的代码

 private static boolean isChoice(TextField nameInput, String message) {
    // TODO Auto-generated method stub

     try {
         int choice = Integer.parseInt(nameInput.getText());
         if(choice == 1) {
             System.out.println("I want to play game again");
             return true;
         }
         else if (choice == 2){
             System.out.println("I want to stop playing");
             return false;
         }
         else {
             System.out.println("Invalid entry");
             return false;
         }
     }
     catch(NumberFormatException e){
         System.out.println(message + " Invalid .Enter 1 for yes and 2 for no");
         return false;
     }
}

应该要求用户输入是或否。如果用户输入无效,应该向用户显示错误消息,并再次询问答案,直到他们回答是或否。

1 个答案:

答案 0 :(得分:2)

一种方法是使用Bindings禁用Button,除非TextField包含YesNo(忽略大小写)。

使用Bindings的演示应用。

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication357 extends Application
{

    @Override
    public void start(Stage primaryStage)
    {
        TextField textField = new TextField();

        Button btn = new Button();
        btn.disableProperty().bind(Bindings.notEqualIgnoreCase("yes", textField.textProperty()).and(Bindings.notEqualIgnoreCase("no", textField.textProperty())));
        btn.setText("Say 'Hello World'");
        btn.setOnAction((ActionEvent event) -> {
            System.out.println("Hello World!");
        });

        StackPane root = new StackPane(new VBox(textField, btn));

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}