Можно ли вернуть переменную в javaFX из метода close? Есть ли более эффективный способ сделать это? - PullRequest
1 голос
/ 25 марта 2019

Я хотел бы запустить метод, который будет закрывать всплывающее окно, когда выбран ответ или окно закрывается вручную, а затем возвращать выбранное значение (логическое значение).К сожалению, я не знаю, как мне получить данные, потому что я первоначально вызываю метод, который отображает запрос, а не метод close.

Я пробовал много разных вещей, но когда я пытаюсь использовать метод close, яЯ не могу получить данные, возвращенные из него.В противном случае данные возвращаются до того, как пользователь сможет их изменить.Ни один из результатов не достигает моей цели

Это мой метод, который создает коробку.В настоящее время я просто закрываю окно вместо того, чтобы закрываться с помощью альтернативного метода закрытия.

public class ConfirmBox
{
   static boolean answer;
   public static boolean display(String title, String question) {
         Stage window = new Stage();
        //Block events to other windows
        window.initModality(Modality.APPLICATION_MODAL);
        window.setTitle(title);
        window.setMinWidth(250);
        //LabelQ
        Label label = new Label();
        label.setText(question);
        //YesBox
        Button yesB= new Button("Yes");
        yesB.getStyleClass().add("button-green");
        yesB.setOnAction(e -> {
            answer=true;
            window.close();
        });
        //NoBox
        Button noB= new Button("No");
        noB.getStyleClass().add("button-red");
        yesB.setOnAction(e -> {
            answer=false;
            window.close();
        });

        window.setOnCloseRequest(e ->{
            e.consume();
            window.close();
        });

        VBox layout = new VBox(10);
        layout.getChildren().addAll(label, yesB, noB);
        layout.setAlignment(Pos.CENTER);

        //Display window and wait for it to be closed before returning
        Scene scene = new Scene(layout, 800, 200);
        scene.getStylesheets().add("styles.css");
        window.setScene(scene);
        window.showAndWait();
        return answer;
    }
}

Это мой метод, который до сих пор выполняет все.

public class Main extends Application
{
    Stage window;
    String gender;
    String name;
    public static void main (String[] args){
        launch (args);
    }
    public void start(Stage primaryStage) throws Exception{
        window= primaryStage;
        window.setTitle("Pokemon Gray");
        GridPane grid= new GridPane();
        grid.setPadding(new Insets(10, 10, 10, 10));
        grid.setVgap(8);
        grid.setHgap(10);
        // Name Label
        Label nameLabel= new Label("UserName");
        GridPane.setConstraints(nameLabel,0, 0);

        //Name input
        TextField nameInput = new TextField();
        GridPane.setConstraints(nameInput,1, 0);


        //GenderLabel
        Label genderLabel= new Label("Gender");
        GridPane.setConstraints(genderLabel,0, 1);

        //Gender Boy
        Button boySelect= new Button("Boy");
        boySelect.getStyleClass().add("button-blue");
        GridPane.setConstraints(boySelect, 1, 1);
        boySelect.setOnAction(e-> gender="Male");


        //Gender Girl
        Button girlSelect= new Button("Girl");
        girlSelect.getStyleClass().add("button-red");
        GridPane.setConstraints(girlSelect, 2, 1);
        girlSelect.setOnAction(e-> gender="Female");

        //Login
        Button saveName= new Button("Save Name");
        GridPane.setConstraints(saveName, 1, 2);
        saveName.setOnAction( e -> {
            boolean valid =verifyText(nameInput.getText());
            if ((valid)&&((gender == "Male")||(gender=="Female"))){
                String qStr= "Are you sure your name is "+nameInput.getText()+" and you are a "+gender+"?";
                boolean confirmed= ConfirmBox.display("Confirmation", qStr );
                if (confirmed == true){
                    name= nameInput.getText();
                }
            }
            else{
                ErrorBox.display("Error", "You must enter a name less than 20 characters long and a gender");
            }
        });

        grid.getChildren().addAll(nameLabel, nameInput, genderLabel, boySelect, girlSelect, saveName);
        Scene scene= new Scene(grid, 1000, 1000);
        scene.getStylesheets().add("styles.css");
        window.setScene(scene);
        window.show();
    }
    public boolean verifyText(String text){
        boolean valid;
        if ((text.length() > 0) && (text.length() <= 20)){
            valid= true;
        }
        else{
            valid=false;
        }
        return valid;
    }
}

Я хочу иметь возможность запуститьотдельный метод, который закрывает его и возвращает логический ответ в ConfirmBox методу Main.Но в настоящее время он возвращает ноль, потому что он возвращает немедленно.

Редактировать: Следует отметить, что в настоящее время у меня нет метода закрытия.Я удалил свой предыдущий, потому что он вызвал много проблем.

1 Ответ

0 голосов
/ 25 марта 2019

Я думаю, что вы не можете сделать это, вам нужно сделать еще один экран, например:

If(button.getResult==yes){"charge yesscreen")else{"charge no screen"}

Контроллеры для разных экранов не могут взаимодействовать с другими экранами, вы можете вызывать только разные экраныот к контроллеру, но вы не можете передавать значения с ним, попробуйте сделать что-то вроде этого, я работаю с javafx с этим менталитетом, все экраны независимы, и вы только вызываете разные экраны.Вы можете сделать что-то вроде этого:

  class first screen{
is a girl?
is a charizar?
is a x)
if(isgirl && is a x...){
call screen x
}else if(ismen&& is a z..){

call screen z
}


{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...