2017-05-18 7 views
0

JavaFX UI 업데이트에 문제가 있습니다. 이미 표시된 경우 씬 차트의 꺾은 선형 차트 및 일부 레이블을 업데이트하려고합니다. 내 작업은 dataseries를 반환하는 다른 클래스의 함수를 호출하여 일부 계산을 수행하고 차트에 업데이트 된 시리즈를 추가하는 것입니다. (루프에)JavaFX의 라이브 업데이트 라인 차트

다음 코드는 내가하고 싶은 것을 제시 할 수있다 :

//double x - x value of the point i want to add to my chart 
//double y - y value of the point i want to add to my chart 
//string s - some result from function 
mySeries.getData().add(new XYChart.Data(x, y)); 
someLabel.setText(s); 

내 프로그램 동결 및 시간 이후에만 최종 솔루션을 제공,하지만 난에있는 점을보고 싶어 차트는 실행이 끝난 시점이 아니라 추가 된 후 정확히 표시됩니다. 프로세스가 너무 빠르면 차트에 다음 포인트를 추가하기 전에 Thread.sleep (1000)을 추가하고 싶습니다.

스레드, 동시성 및 작업과 관련이 있다는 것을 알고 있지만 아직 해결책을 찾을 수 없습니다. 여기에있는 코드를 사용해 보았지만 정답을 모르겠습니다.

+0

당신은 주 스레드에서 많은 일을하고 있습니다. – Sedrick

답변

1

모든 사용자 작업 (예 : 버튼을 클릭하면 UI 스레드 내에서 동작 수신기에 알립니다. UI 스레드의 논리는 가능한 한 빨리되어야합니다. 사용자 이벤트에 반응하고 UI 스레드에서 장기 실행 작업을 실행한다고 생각합니다. 코드를 백그라운드 스레드에 넣으십시오. 또한 UI 업데이트를 UI 스레드에 다시 넣어야합니다. "Platform.runLater (...)"로이 작업을 수행 할 수 있습니다. 이 같은

뭔가 :

public class Test extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Scene scene = new Scene(createChart()); 
     primaryStage.setScene(scene); 
     primaryStage.setHeight(800); 
     primaryStage.setWidth(1200); 
     primaryStage.show(); 
    } 

    private Parent createChart() { 
     LineChart<Number, Number> lc = new LineChart<>(new NumberAxis(), new NumberAxis()); 
     XYChart.Series<Number, Number> series = new XYChart.Series<>(); 
     lc.getData().add(series); 

     new Thread(() -> { 
      try { 
       Thread.sleep(5000); 
       for (int i = 0; i < 15; i++) { 
        int finalI = i; 
        Platform.runLater(() -> series.getData().add(new XYChart.Data<>(1 + finalI, 1 + finalI))); 
        Thread.sleep(1000); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     }).start(); 

     return lc; 
    } 

}