Javafx Pas sur fx thread d'application lors de l'utilisation de la minuterie
Je suis en utilisant ce
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Group root = new Group();
Scene scene = new Scene(root, 600, 400);
primaryStage.setScene(scene);
Circle circle = new Circle(300,200,50, Color.BLACK);
primaryStage.setTitle("Circle");
primaryStage.setResizable(false);
root.getChildren().add(circle);
moveCircle(circle, scene);
primaryStage.show();
}
public int random(int min, int max) {
return new Random().nextInt((max - min) + min);
}
public int random(int max) {
return random(0, max);
}
public void moveCircle(Circle circle, Scene scene) {
Platform.runLater(() -> {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
circle.setCenterX(random((int) scene.getX()));
circle.setCenterY(random((int) scene.getY()));
}
}, 1000, 1000);
});
}
Mais c':
public void moveCircle(Circle circle, Scene scene) {
Platform.runLater(() -> {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
circle.setCenterX(random((int) scene.getX()));
circle.setCenterY(random((int) scene.getY()));
}
}, 1000, 1000);
});
}
Me donne cette erreur:
Exception in thread "Timer-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = Timer-0
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:204)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:364)
at javafx.scene.Scene.addToDirtyList(Scene.java:485)
at javafx.scene.Node.addToSceneDirtyList(Node.java:424)
at javafx.scene.Node.impl_markDirty(Node.java:415)
at javafx.scene.shape.Shape.impl_markDirty(Shape.java:942)
at javafx.scene.shape.Circle$1.invalidated(Circle.java:136)
at javafx.beans.property.DoublePropertyBase.markInvalid(DoublePropertyBase.java:112)
at javafx.beans.property.DoublePropertyBase.set(DoublePropertyBase.java:146)
at javafx.scene.shape.Circle.setCenterX(Circle.java:122)
at Main$2.run(Main.java:48)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Et je ne vois vraiment pas quel est le problème
Vous devez vous connecter pour publier un commentaire.
Il est peut-être parce que vous avez mal compris comment
Platform.runLater()
fonctionne..Le bon extrait de code serait:
Mais:
Je vous recommandons fortement de ne pas utiliser
Timer
maisScénario
à la place! Il fait partie de l'API JavaFX et vous n'avez pas à faire cesPlatform.runLater()
appels. C'est juste rapidement bidouillé, mais vous voyez l'idée: