В рамках моих усилий по ознакомлению с моделью MVC я пытаюсь написать программу, которая перебирает набор кодовых вычислений, время от времени делая паузу, запрашивая у пользователя ввод данных с помощью пользовательских окон, созданных в JavaFX, с использованием этого ввода.продолжить вычисления, пока не будет достигнут определенный результат, чтобы разорвать цикл.Идея состоит в том, что для каждого окна пользователь выбирает опцию, окно закрывается, а затем логика продолжается до тех пор, пока не потребуется следующий ввод пользователя.Затем открывается следующее окно и процесс продолжается.В зависимости от того, что вводит пользователь, варианты, включенные в следующее окно, могут измениться.Для моего начального примера окно имеет четыре кнопки с цифрами 1-4 и предлагает пользователю выбрать номер.Я свел мой код к чему-то действительно простому:
public class LogicLoop()
{
public static AtomicInteger CHOICE; //Global variable to act as the user's current choice, as there is only ever one choice made at a time
public static boolean loopDone = false;
public static void main(String [] args)
{
new Start().startLoop(); //Calls the class that extends Application to call the launch() command. Since launch() can only be called once, it needs to be outside the loop
logicLoop();
}
public void logicLoop()
{
while(!loopDone)
{
Chooser chooser = new Chooser();
chooser.show();
int choice = CHOICE.get();
CHOICE = null;
doSomething(choice);
}
public doSomething(int choice)
{
//Set some other variables to modify how the next window will look
//Potentially set loopDone to true;
}
}
}
И затем мой класс Chooser:
public class Chooser()
{
public int show()
{
Stage newStage = new Stage();
createWindow(newStage); //method that sets up window based on global variables and calls show() on newStage. Each button in the window will close the stage. The CHOICE value will also be set based on the user's input
}
}
Окно, созданное createWindow (), имеет кнопки со следующим методом handle ():
public void handle(ActionEvent event) {
CHOICE = new AtomicInteger(btn.getValue()); //I made my own Button class that has a value variable and a getter() for it
Stage stage = (Stage) btn.getScene().getWindow();
stage.close();
}
Проблема, с которой я сталкиваюсь, заключается в том, что когда мой код переходит к исполнению, логика не ждет ввода пользователя, прежде чем продолжить сразу после метода show ().Так что происходит, когда код запускает цикл и сразу вызывает первое окно.В то же время генерируется исключение NullPointerException, потому что моя логика уже пытается вызвать CHOICE.get (), прежде чем пользователь даже успеет ввести какое-либо значение.Поэтому после выбора кнопки и закрытия первого окна больше ничего не происходит.
До сих пор я пытался использовать метод showAndWait () в моем методе createWindow (), но, похоже, это не имеет никакого значения.Я попытался вызвать команду wait () после chooser.show (), но она просто добавляет задержку, и затем я вижу те же результаты.Основываясь на информации, которую я смог найти о переполнении стека, я видел много рекомендаций по использованию метода Platform.runLater (), но я не понимаю, как это будет эффективно здесь.Если GUI запустится позже, логика все равно будет просто бегать вперед без него.Мне нужно, чтобы логический цикл приостанавливался до закрытия окна, что, похоже, и предназначено для showAndWait ().Что меня больше всего смущает, так это утверждение, с которым я столкнулся при поиске ответа, в котором говорилось, что реализация базовой инфраструктуры MVC не требует многопоточности и что новичку не рекомендуется ее использовать.На данном этапе я не уверен, как это возможно.
Что мне здесь не хватает?