2016-08-23 2 views
0

, 나는 이벤트 핸들러를 등록 할 경우 :자바 FX 작업 핸들러는 취급 자바 FX UI 노드 들어있는 스레드

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() 항상 자바 FX 애플리케이션 스레드에서 실행됩니다 내부 내가 코드를 가정 할 수 있으므로 필요에가 없습니다 그들을 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(); 
      } 
     }); 
    } 
} 

하는 스레드에서 작업의 이벤트 핸들러에서 실행? JavaFX 응용 프로그램 스레드에서 수행해야하는 perform restart on a javafx.concurrent.ScheduledService -> portfolioService.restart()을 수행해야하므로 Platform.runLater 안에 포장합니다.

하지만 필수 항목입니까? 이 태스크 이벤트 핸들러는 JavaFX Application Thread에서도 항상 실행됩니까? 감사!

Task의 자바 FX 문서는 대답이

답변

1

: 작업은 자바 FX의 GUI 응용 프로그램을 사용하도록 설계되어 있기 때문에

을, 그것을 보장 자사의 공용 속성뿐만 아니라 상태에 대한 변경 알림, 오류에 대한 모든 변경 , 이벤트 처리기의 경우 모두 주 JavaFX 응용 프로그램 스레드에서 발생합니다.

그래서 아니요, Platform.runLater으로 전화를 거는 필요가 없습니다.

+0

답장을 보내 주셔서 감사합니다. :) –

+0

@firephil -이 질문과 예제를주의 깊게 읽으십시오. 이 질문은'onSucceeded' 이벤트와'onFailed' 이벤트에 관한 것입니다.이 이벤트는'Task' 클래스가 항상 JavaFX UI 스레드에서 호출합니다. 'Task' 문서에있는 예제들은'onSucceeded' 또는'onFailed' 이벤트 핸들러가 아닌 태스크의 메인 로직 내부에서 변경됩니다. – Itai