2015-01-22 2 views
0

비슷한 주제를 모두 읽었지만 여전히 문제를 파악할 수 없습니다. 여기에 LineChart를 사용하고 스크롤 할 때 확대/축소하고 싶습니다. 이 같은 코드 :JavaFX 비 응용 프로그램 스레드에서 UI를 변경할 수 없습니다.

EventHandler<ScrollEvent> scrollHandler = new EventHandler<ScrollEvent>(){ 

    @Override 
    public void handle(ScrollEvent event) { 
     System.out.println("view scroll"); 

      NumberAxis xAxis = ((LineChartView)view).getXAxis(); 
      xAxis.setLowerBound(xAxis.getLowerBound() + 10); 
      xAxis.setUpperBound(xAxis.getUpperBound() - 10); 

      Platform.runLater(new Runnable(){ 

      @Override 
      public void run() { 
       curStage.show(); 
      } 

      }); 
    } 

}; 

로그이 프로그램은 청취자로 실행 말한다, 그러나 선 차트에 변화가 없다 : 여기

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));  
    Scene scene = new Scene(root); 

    DataModel dataModel = new DataModel(); 
    dataModel.getData("value", "value_tbl"); // get data from specified file 

    IViewFactory viewFactory = new LineViewFactory(); 
    view = viewFactory.create();    // create lineChart view 

    view.setData(dataModel.getData("value", "value_tbl")); // load data into LineChart, here should be XYChart.Series 
    this.getCanvas(root).getChildren().addAll(view.getView()); 
    stage.setScene(scene); 
    curStage = stage; 

    view.getView().setOnScroll(this.scrollHandler); // set listener 

    stage.show(); 
} 

와 청취자입니다.

Application의 start() 메서드와 scrollHandler는 둘 다 응용 프로그램에 있습니다. 그러나 LineChartView 프로그램은 다른 패키지에 있습니다. 그럼, 아무도 왜 그것이 작동하지 않는 이유를 지적 할 수 있습니까? 정말 고맙습니다!

나는 작동 할 수있는 비슷한 코드를 읽었지만 큰 차이가 있습니다. 모든 프로그램이 모두 Application 아래에 있습니다.

답변

0

이벤트 처리기는 JavaFX 응용 프로그램 스레드에서 JavaFX 시스템에 의해 실행됩니다. 따라서 JavaFX 응용 프로그램 스레드에 있고 (제공된 코드가 다른 스레드를 생성하지 못함) 모든 논리가 JavaFX 응용 프로그램 스레드에서 실행 중이며 논리를 전환하기 위해 동시성 유틸리티를 사용할 필요가 없습니다 JavaFX 응용 프로그램 스레드로; 즉, Platform.runLater()에 대한 호출은 불필요합니다.

당신은 당신이 어떤 스레드 확실하지 않은 경우, 당신은 항상 호출하여 찾을 수 있습니다 : 코드에 대한

System.out.println("Current thread: " + Thread.currentThread().getName()); 

, 이것은 항상 인쇄 "현재 스레드 : 자바 FX 애플리케이션 스레드를"합니다.

코드가 작동하지 않는 이유는 스레딩과 관련이없는 몇 가지 이유이지만 문제를 복제하는 mcve을 (새) 질문에 포함 시키면 환경 세부 정보와 전체 텍스트를 작성하는 것이 좋습니다 오류 또는 스택 추적을 얻습니다.

+0

정말 고마워요! 당신의 충고는 전체 메커니즘에 대해 훨씬 더 분명하게 해줍니다. 그리고 문제는 setAutoRange (false)입니다. – xing

관련 문제