Надеюсь, я не дублирую вопрос, но я не мог найти его специально для моей проблемы. Я разрабатываю небольшое приложение для флеш-карт, используя JavaFX для создания графического интерфейса. Программа должна работает следующим образом:Подождите, а затем получите ввод текстового поля без замораживания GUI
- пользователь выбирает настройки, а затем нажимает начала кнопку.
- gui отображает вопрос и текстовое поле для ввода пользователем.
- пользовательские входы отвечают в течение X секунд или gui автоматически переходят к следующему вопросу - в качестве альтернативы, пользователь может сразу перейти к следующему вопросу, нажав следующий.
- GUI отображает оценку и среднее значение.
проблемы является getText()
от пользователя TextField обрабатывается как только начала нажата кнопка, не давая пользователю возможность ввести ответ. Как заставить программу ждать X секунд или для кнопки , следующей за кнопкой, которую нужно нажать перед обработкой ответа пользователя? Вот мой код:
//start button changes view and then runs startTest()
start.setOnAction(e -> {
setLeft(null);
setRight(null);
setCenter(test_container);
running_program_title.setText(getDifficulty().name() + " Test");
buttons_container.getChildren().clear();
buttons_container.getChildren().addAll(next, quit, submit);
startTest();
});
Вот код проблемы ... по крайней мере, как я его вижу.
//startTest method calls askAdd() to ask an addition question
void startTest() {
int asked = 0;
int correct = 0;
while (asked < numberOfQuestions) {
if(askAdd()){
correct++;
asked++;
}
}
boolean askAdd() {
int a = (int) (Math.random() * getMultiplier());
int b = (int) (Math.random() * getMultiplier());
//ask question
question.setText("What is " + a + " + " + b + "?");
//code needed to pause method and wait for user input for X seconds
//retrieve user answer and return if its correct
return answer.getText().equalsIgnoreCase(String.valueOf(a+b));
}
Я попытался с помощью Thread.sleep(X)
но замораживает графический интерфейс для сколь угодно долго я указываю, а затем проходит через метод addAsk()
и петли перед выходом на экран тестирования. (Я знаю, потому что у меня была программа, предназначенная для печати вопросов и ответов на консоль). Он показывает последний вопрос, и все.
Я не включил следующий код, потому что я не могу заставить gui перейти на тестовую страницу в любом случае.
Любая помощь по любому из кодов оценивается.
У вас есть несколько недоразумений в своем ответе. Вероятно, вы хотите установить разрешенное время на пять секунд, а не на 500 секунд. ['ProgressProperty'] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ProgressIndicator.html#progressProperty--) должно быть числом от нуля до единицы, поэтому вы не должен двунаправленно связывать его со значением, которое варьируется от нуля до ста. Здесь предпочтительнее однонаправленное связывание: 'progressBar.progressProperty(). Bind (percentOfTimeUsed.divide (100.0));' – jewelsea
@jewelsea Это объясняет проблему с допустимым временем - Спасибо, что указали это. Пример сверху. –
Именно то, что я искал. Спасибо. – gabe2390