Передача значения с одного окна в другое в javafx

209
14 апреля 2019, 02:00

Делаю игру по типу монополии, и возник вопрос над которым уже сижу пару дней. Вообщем, при создании новой игры (нажатия кнопки "Новая игра"), вылазит меню, в котором игрок должен выбрать сколько игроков должно быть в его игре и, по желанию, может задать им имена. Класс новой игры в свою очередь должен вернуть коллекцию имен игроков. Проблема заключается в том, что в главной проге, когда я нажимаю на кнопку, ей сразу после открытия окна передается нулл значение и проходит дальше, где у меня стоит проверка на нулл.

arrayLengthCounter = arr.size();
System.out.println(arrayLengthCounter);
  if(arr != null) {
    for (int i = 0; i < arrayLengthCounter; i++) {
      playerHBox = addPlayerHBox();
      System.out.println("hbox created");
    }
}

После этого оно проходит проверку, а после того когда я задаю значение в окне, оно возращается переменной в мейне, но через цикл больше не проходит и больше ничего не создает. Второй вариант у меня был с тем чтобы класс новой игры возращал сразу готовые hbox'ы в заданном колличестве, но проблема осталась той же, значения просто не добавлялись в лейаут.

if(hueHueBox != null){
  layout.getChildren().addAll(hueHueBox);
}

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

buyPanelHouse.setOnAction(e -> {
  int n = buyPanelHouseMenu.display();
  System.out.println(n);
  if(n == 1){
    Rectangle r = new Rectangle(120,30); //должен просто создаться прямоугольник в окне
    r.setFill(Color.RED);
    GridPane.setConstraints(r, 0,0);
    hBoxGridPaneProcess.getChildren().addAll(r);
  }
});

Буду признателен за любую помощь и/или советы

Класс создания окна:

    import javafx.scene.text.Text;
    import javafx.stage.*;
    import javafx.scene.*;
    import javafx.scene.layout.*;
    import javafx.scene.control.*;
    import javafx.geometry.*;
    import java.util.ArrayList;
    import static java.lang.Double.MAX_VALUE;
public class createMenuBox {
private static int n;
private  static HBox hueHueBox = null;
public static HBox display() {
    Stage window = new Stage();
    VBox layout = new VBox(10);
    layout.setPadding(new Insets(20, 20, 20, 20));
    TextField[] tfArr = new TextField[5];
    ArrayList<String> returnArr = new ArrayList<>();
    window.initModality(Modality.APPLICATION_MODAL);
    window.setTitle("Подготовка");
    ChoiceBox<Integer> choiceBox = new ChoiceBox<>();

    Scene scene = new Scene(layout,400, 500);
    window.setScene(scene);
    window.show();
    //default option
    choiceBox.getItems().addAll(2,3,4,5);
    choiceBox.setValue(2);
    choiceBox.setMaxSize(MAX_VALUE, MAX_VALUE);
    Text windowTitle = new Text("Задайте колличество игроков");
    Text windowSecondTitle = new Text("Отличный выбор!");
    Text playerNameTitle = new Text("Нажмите, если вам не нравятся стандартные имена");
    Text startButtonTitle = new Text("Нажмите, если считаете себя готовым");
    Text startButtonSecondTitle = new Text("Пожалуйста, не оставляйте поля пустыми");
    layout.getChildren().addAll(windowTitle);
    Button btn = new Button("Сохранить");
    layout.getChildren().addAll(choiceBox, btn);
    Button buttonSetNames = new Button("Задать имена");
    Button startBtn = new Button("Готово");
    startBtn.setMaxSize(MAX_VALUE, MAX_VALUE);
    btn.setMaxSize(MAX_VALUE, MAX_VALUE);
    btn.setOnAction(e -> {
        getChoice(choiceBox);
        System.out.println(n);
        layout.getChildren().remove(windowTitle);
        layout.getChildren().add(windowSecondTitle);
        layout.getChildren().add(buttonSetNames);
        buttonSetNames.setMaxSize(MAX_VALUE, MAX_VALUE);
        layout.getChildren().add(playerNameTitle);
        layout.getChildren().add(startBtn);
        layout.getChildren().add(startButtonTitle);
        startBtn.setOnAction(ee -> {
            for (int i = 0; i < n; i++) {
                if (tfArr[i] == null){
                    returnArr.add(i, ("Игрок-" + (i+1)));
                }
                System.out.println(returnArr.get(i));
            }
            if(returnArr != null) {
                for (int i = 0; i < returnArr.size(); i++) {
                    hueHueBox = Main.addPlayerHBox();
                    System.out.println("hbox created");
                }
            }
            window.close();
        });
        choiceBox.setDisable(true);
        btn.setDisable(true);
    });
    buttonSetNames.setOnAction(e -> {
        layout.getChildren().remove(startButtonTitle);
        layout.getChildren().remove(playerNameTitle);
        layout.getChildren().remove(windowSecondTitle);
        layout.getChildren().remove(startBtn);
        buttonSetNames.setDisable(true);
        for (int i = 0; i < n; i++) {
            tfArr[i] = new TextField();
            layout.getChildren().add(tfArr[i]);
        }
        startBtn.setMaxSize(MAX_VALUE, MAX_VALUE);
        layout.getChildren().add(startBtn);
        layout.getChildren().add(startButtonSecondTitle);
        startBtn.setOnAction(ee -> {
            for (int i = 0; i < n; i++) {
                returnArr.add(i, tfArr[i].getText());
                if (tfArr[i].getText().trim().isEmpty()){
                    returnArr.add(i, ("Игрок-" + (i+1)));
                }
                System.out.println(returnArr.get(i));
            }
            if(returnArr != null) {
                for (int i = 0; i < returnArr.size(); i++) {
                    hueHueBox = Main.addPlayerHBox();
                    System.out.println("hbox created");
                }
            }
            window.close();
        });
    });
        return hueHueBox;
}
  private static void getChoice(ChoiceBox<Integer> choiceBox) {
      n = choiceBox.getValue();
  }
}
READ ALSO
как сделать программу в full screen Javafx?

как сделать программу в full screen Javafx?

Есть ли способ сделать в javafx всё приложение в полноэкранном режиме? проблема заключается в том, что когда вызываю смену сцены Applicationstage

227
Использование метода Android KTX в Java коде

Использование метода Android KTX в Java коде

Можно ли каким-либо образом использовать метод Contexttoast(text: CharSequence, duration: Int = Toast

185
Не работает удаление в hibernate

Не работает удаление в hibernate

Не работает subcompetenceRepositorydelete(id)

211
Вопрос по использованию сервлетов

Вопрос по использованию сервлетов

Такой вопрос, как лучше использовать сервлеты? Для каждого типа запросов свой сервлет или один большой сервлет, который принимает все запросы...

283