2016-11-23 2 views
0

Я пишу приложение, которое отображает данные о точном просмотре изображения, которое отображается пользователю. Чтобы убедиться, что графический интерфейс не замерзает, я делаю опрос данных, картирование и другие вычисления в режиме просмотра eyetracking в отдельном Task.JavaFX - Вызов методов графического интерфейса из другого потока

Проблема, с которой я столкнулся, заключается в том, что для сопоставления координат экрана с моим отображаемым изображением я должен позвонить 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();