Zwykłem mieć prostą, czasową (mniej więcej lub mniej) nieskończoną pętlę:
while (!canrun) {
do_stuff(); //simple calculation
update_gui(); //updates some labels
Thread.sleep(waittime);
}
Który, naturalnie zamarza aplikację JavaFX, dopóki nie zostanie zakończona wszystkimi obliczeniami (opcja canrun jest ustawiona na false).
Zastąpiłem go osią czasu:
event = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
do_stuff();
update_gui();
}
};
keyframe = new KeyFrame(Duration.millis(waittime), event);
timeline = new Timeline(Timeline.INDEFINITE, keyframe);
do_stuff () wygląda następująco:
public void do_stuff() {
do_the_actual_stuff();
if (stuff_finished) timeline.stop();
}
(waittime jest tutaj liczbą od 1 do 1000 (ms)). Na Buttonclick uruchamiam go z timeline.play (), i w do_stuff () zatrzymuję go, gdy obliczenia są wykonywane z timeline.stop ().
Mam również funkcję zmiany czasu oczekiwania (nawet gdy działa):
public void changewaittime() {
if (!(timeline.getStatus() == Animation.Status.RUNNING)) {
keyframe = new KeyFrame(Duration.millis(waittime), event);
timeline = new Timeline(Timeline.INDEFINITE, keyframe);
} else {
timeline.stop();
keyframe = new KeyFrame(Duration.millis(waittime), event);
timeline = new Timeline(Timeline.INDEFINITE, keyframe);
timeline.play();
}
}
A teraz mój problem polega na tym, że Oś czasu działa tylkojeden raz, a nie ciągle, nie wprowadza nawet ponownie do_stuff (), tylko jeśli ponownie wywołasz funkcję timeline.play () Nawet bezpośrednie wywołanie timeline.setCycleCount (Timeline.INDEFINITE) nie pomaga.
Coś, co przegapiłem?
Edycja: Nie udało mi się znaleźć mojego błędu, więc przepisałem cały GUI, a teraz działa.
Odpowiedzi:
0 dla odpowiedzi № 1W konstruktorze osi czasu ustawiasz liczbę klatek na sekundę za pomocą stałej przeznaczonej do liczenia cykli.
Posługiwać się http://docs.oracle.com/javafx/2/api/javafx/animation/Animation.html#setCycleCount(int).
-2 dla odpowiedzi nr 2
Rozwiązałem problem, przepisując pełny GUI i Oś czasu. Nie wiem, dlaczego wcześniej nie działało, ale teraz działa.