Как исправить проблему «Диалоговое окно JavaFX, принимающее пользовательский ввод»

#javafx #dialog #iteration

#javafx #диалоговое окно #итерация

Вопрос:

введите описание изображения здесьЯ создаю диалоговое окно JavaFX, и я написал в значительной степени код. Моя проблема в том, как отобразить сообщение об ошибке, если пользователь вводит неверный ввод. Я знаю, что где-то должен использовать цикл while, но не уверен, где именно, из-за структуры диалогового окна JavaFX. Вторая проблема заключается в том, что если пользователь вводит правильный ввод, скажем, 1 для yes, я бы хотел вызвать функцию для выполнения задачи.

Написанный мной код вызывает всплывающее окно и выводит результат пользовательского ввода на консоль.

     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. Седрик дал отличный ответ на это, который показывает, как использовать как привязки, так и прослушиватели действий. Теперь мне просто любопытно, может быть, это просто лучше подходит для стиля игры или просто вам это нравится, но для такого случая, когда это диалоговое окно «да» или «Нет», не было бы проще просто иметь кнопку «да» и «нет»? Это означает, что вам вообще не придется проверять ввод. Вместо этого вы могли бы просто добавить два прослушивателя действий, по одному для каждой кнопки, а затем выполнить свои действия. Меньше кликов, а также преимущество, заключающееся в том, что пользователь не может вводить недопустимые значения. Просто некоторые мысли 🙂

Ответ №1:

Один из способов, который вы можете сделать, это использовать Bindings для отключения Button , если TextField не содержит Yes или No (игнорировать регистр).

Демонстрационное приложение с использованием 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);
    }

}
  

Комментарии:

1. Извиняюсь за поздний ответ. Я использовал некоторые строки кода, и это работает нормально. Единственное исключение — если введен неверный ввод, и я хочу вывести неверное сообщение в диалоговое окно

2. Я чувствую, что это заставляет пользователя вводить правильную информацию, прежде чем они смогут двигаться вперед. Итак, для меня это устраняет необходимость в диалоговом окне.

3. Я бы избавился от опций закрытия вверху и установил режим.

4. @Robert также дал хороший совет. Вы также можете пойти сюда и использовать что-то из коробки.

5. Я изменил эту строку в вашем коде, потому что ‘bind’, похоже, не отображается как один из вариантов. Я должен ввести «да». Если я ввожу YES или другую комбинацию букв, это расценивает ввод как недопустимый ‘btn.disableProperty().bind(Bindings.notEqualIgnoreCase(«да», TextField.TextProperty()).и(Bindings.notEqualIgnoreCase(«нет», TextField.TextProperty())));’ ‘