Mam nadzieję, że nie powielam pytania, ale nie udało mi się znaleźć jednego konkretnego problemu. Pracuję nad małą kartą z matematyką, używając JavaFX do stworzenia GUI. Program powinien przebiega następująco:Poczekaj, a następnie otrzymasz tekstowe dane wejściowe bez zamrożenia GUI
- użytkownik dobiera ustawienia, a następnie naciska początek przycisk.
- gui wyświetla pytanie i pole tekstowe do wprowadzania danych przez użytkownika.
- wprowadzane przez użytkownika odpowiedzi w ciągu X sekund lub gui automatycznie przechodzą do następnego pytania - alternatywnie użytkownik może przejść do następnego pytania natychmiast, naciskając następny przycisk.
- GUI wyświetla wynik i średnią.
problemów jest getText()
z tekstowym użytkownika jest przetwarzane tak szybko, jak początku przycisk jest wciśnięty, nie dając użytkownikowi możliwość wejścia odpowiedź. Jak sprawić, aby program czekał na X sekund lub przycisk Kliknij, aby kliknąć zanim rozpatrzy odpowiedź użytkownika? Oto mój kod:
//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();
});
Oto kod problemu ... przynajmniej jak go widzę.
//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));
}
Próbowałem za pomocą Thread.sleep(X)
ale że zamarznie gui na długo jednak określić, a następnie przechodzi przez sposobu addAsk()
i pętli przed udaniem się na ekranie testowym. (Wiem, ponieważ miałem ustawiony program, aby wydrukować pytania i odpowiedzieć na wejście do konsoli). Pokazuje ostatnie pytanie i to wszystko.
Nie dodałem kodu przycisku next, ponieważ nie mogę uzyskać gui, aby przejść do strony testowej.
Każda pomoc dotycząca dowolnego kodu jest doceniana.
Masz kilka nieporozumień w swojej odpowiedzi. Prawdopodobnie chcesz ustawić dozwoloną czas na pięć sekund, a nie na 500 sekund. Właściwość ['progressProperty'] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ProgressIndicator.html#progressProperty--) powinna być liczbą od zera do jedności, więc nie powinno dwukierunkowo wiązać go do wartości, która waha się od zera do stu. Preferowane jest jednokierunkowe wiązanie: 'progressBar.progressProperty(). Bind (percentOfTimeUsed.divide (100.0));' – jewelsea
@jewelsea To wyjaśnia problem z dozwolonym czasem - dziękuję za wskazanie tego. Wzniesiony przykład. –
Dokładnie tego, czego szukałem. Dziękuję Ci. – gabe2390