2016-11-23 54 views
0

我正在编写一个应用程序,它将eyetracking数据映射到显示给用户的图像。为了确保GUI不会冻结,我在单独的Task中进行eyetracking数据轮询,映射和其他计算。JavaFX - 从不同线程调用GUI方法

我面临的问题是,为了将屏幕坐标映射到我显示的图像上,我必须致电Node.screenToLocal(x,y)。我如何在不违反线程安全的情况下进行这些调用?

回答

1

使用AnimationTimer为此呼吁:

Task<Point2D> task = new Task<Point2D>() { 

    @Override 
    protected Point2D call() throws Exception { 
     while (!isCancelled()) { 
      Point2D eyePos = getEyePos(); 
      updateValue(eyePos); 
     } 
    } 

}; 

AnimationTimer animation = new AnimationTimer() { 

    @Override 
    public void handle(long now) { 
     Point2D point = task.getValue(); 
     if (value != null) { 
      Point2D pointOnScreen = node.screenToLocal(point); 

      // TODO: use result 
     } 
    } 

}; 
animation.play(); 
相关问题