0

I use a service to move my camera (personal class, not javaFX camera) but my while(true) run only once :

Service<Void> moveService = new Service<Void>(){
        protected Task<Void> createTask() {
            return new Task<Void>(){
                protected Void call(){
                    while(true){
                        System.out.println("move");
                        if(up) camera.getLocation().x+=speed;
                        if(down) camera.getLocation().x-=speed;
                        if(right) camera.getLocation().y+=speed;
                        if(left) camera.getLocation().y-=speed;
                        try {
                            this.wait(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
        }
    };
    moveService.start();

Why "run" is displayed only once ? and true isn't an acceptable condition, how can I know if my application is still running ?
Thank you for your help

EDIT:
Camera wasn't initialize, my bad.
But now I have an exception on this line:

this.getChildren().add(new Text(10, 10, this.location.toString()));

java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
at javafx.scene.Parent$2.onProposedChange(Unknown Source)
at com.sun.javafx.collections.VetoableListDecorator.add(Unknown Source)
at display.Camera.display(Camera.java:63)
at display.WindowInspection$3$1.call(WindowInspection.java:98)
at display.WindowInspection$3$1.call(WindowInspection.java:1)
at javafx.concurrent.Task$TaskCallable.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javafx.concurrent.Service.lambda$null$488(Unknown Source)
at javafx.concurrent.Service$$Lambda$160/944212290.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.concurrent.Service.lambda$executeTask$489(Unknown Source)
at javafx.concurrent.Service$$Lambda$158/49730943.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

It's in my method display from my class Camera which extends Pane (JavaFX)

EDIT 2:
this

try {
    this.wait(100);
} catch (Exception e) {
    e.printStackTrace();
}

give me that

java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at display.WindowInspection$3$1.call(WindowInspection.java:103)
at display.WindowInspection$3$1.call(WindowInspection.java:1)
at javafx.concurrent.Task$TaskCallable.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javafx.concurrent.Service.lambda$null$488(Unknown Source)
at javafx.concurrent.Service$$Lambda$161/2101016123.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.concurrent.Service.lambda$executeTask$489(Unknown Source)
at javafx.concurrent.Service$$Lambda$158/1062036711.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at display.WindowInspection$3$1.call(WindowInspection.java:103)
at display.WindowInspection$3$1.call(WindowInspection.java:1)
at javafx.concurrent.Task$TaskCallable.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javafx.concurrent.Service.lambda$null$488(Unknown Source)
at javafx.concurrent.Service$$Lambda$161/2101016123.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.concurrent.Service.lambda$executeTask$489(Unknown Source)
at javafx.concurrent.Service$$Lambda$158/1062036711.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at display.WindowInspection$3$1.call(WindowInspection.java:103)
at display.WindowInspection$3$1.call(WindowInspection.java:1)
at javafx.concurrent.Task$TaskCallable.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javafx.concurrent.Service.lambda$null$488(Unknown Source)
at javafx.concurrent.Service$$Lambda$161/2101016123.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.concurrent.Service.lambda$executeTask$489(Unknown Source)
at javafx.concurrent.Service$$Lambda$158/1062036711.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at display.WindowInspection$3$1.call(WindowInspection.java:103)
at display.WindowInspection$3$1.call(WindowInspection.java:1)
at javafx.concurrent.Task$TaskCallable.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javafx.concurrent.Service.lambda$null$488(Unknown Source)
at javafx.concurrent.Service$$Lambda$161/2101016123.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.concurrent.Service.lambda$executeTask$489(Unknown Source)
at javafx.concurrent.Service$$Lambda$158/1062036711.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at display.WindowInspection$3$1.call(WindowInspection.java:103)
at display.WindowInspection$3$1.call(WindowInspection.java:1)
at javafx.concurrent.Task$TaskCallable.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javafx.concurrent.Service.lambda$null$488(Unknown Source)
at javafx.concurrent.Service$$Lambda$161/2101016123.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.concurrent.Service.lambda$executeTask$489(Unknown Source)
at javafx.concurrent.Service$$Lambda$158/1062036711.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
François MENTEC
  • 1,150
  • 4
  • 12
  • 25
  • 1
    Maybe an exception is being thrown; change your catch block to `catch (Exception e) { ... }` and see if it generates a stack trace. – James_D Jul 03 '15 at 12:53
  • 1
    Read [this](http://stackoverflow.com/questions/30249493/using-threads-to-make-database-requests/30250308#30250308) for a description of why you are getting the `IllegalStateException`. To pause, use `Thread.sleep(100)`, not `this.wait(...)`. Also see [this](http://stackoverflow.com/questions/9966136/javafx-periodic-background-task) for periodically executing some UI update. – James_D Jul 03 '15 at 13:10

0 Answers0