2017-05-18 6 views
0

JavaFX UIを更新する際に問題があります。既に表示されているシーンの折れ線グラフやラベルを更新したいと思います。 私の仕事は、いくつかの計算(dataseriesを返す他のクラスの関数を呼び出す)を行い、更新された系列をグラフに追加することです。JavaFXでLive-Update LineChart

(ループである)次のコードは、私が何をしたいか提示してもよい:

//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; 
    } 

}

関連する問題