2016-08-23 126 views
0

JavaFX的UI节点,如果我注册一个事件处理程序:了JavaFx任务事件处理程序中处理该线程

final MenuItem buyItem = new MenuItem("Buy"); 

buyItem.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(ActionEvent event) { 
     String symbol = row.getItem().getSymbol(); 
     String instrumentID = row.getItem().getInstrumentID(); 
     ..... 
    } 
); 

我可以假设代码中handle()总是在JavaFX应用程序线程中执行,所以没有必要将它们包裹在Platform. runLater内。

但是,当我与javafx.concurrent.Task工作:

import javafx.concurrent.Task; 

public class BuyTask extends Task<Map<String, Object>> { 
    ...... 
} 

BuyTask buyTask = new BuyTask(this.api, params); 
Thread buyThread = new Thread(buyTask); 
buyThread.start(); 

buyTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
    @Override 
    public void handle(final WorkerStateEvent workerStateEvent) { 
     Map<String, Object> result = (Map) workerStateEvent.getSource().getValue(); 

     ....... 

     Platform.runLater(new Runnable() { 
      @Override public void run() { 
       portfolioService.restart(); 
      } 
     }); 
    } 
} 

在哪个线程任务的事件处理程序的执行?由于我需要做的perform restart on a javafx.concurrent.ScheduledService -> portfolioService.restart()其中提到必须在JavaFX应用程序线程中完成,我把它包装在Platform.runLater内。

但是它是必需的吗?此任务事件处理程序是否总是在JavaFX应用程序线程中执行?谢谢!

回答

1

Task JavaFX的文档了答案:

因为任务是专为使用JavaFX GUI应用程序的使用,它可以确保每次更改其公共属性,以及对状态变更通知,错误,以及事件处理程序,都发生在主要的JavaFX应用程序线程中。

所以 - 不,不需要用Platform.runLater包装呼叫。

+0

很酷,谢谢你的回答! :) –

+0

@firephil - 请仔细阅读这个问题和例子。这个问题是关于'onSucceeded'和'onFailed'事件的,'Task'类总是在JavaFX UI线程上调用。 “任务”文档中的示例在该任务的主逻辑内部发生变化,而不是“onSucceeded”或“onFailed”事件处理程序。 – Itai