2017-07-26 6 views
0

私はプログレスバーを更新するメソッドを呼び出すcsvファイルリーダーを持っています。ただし、Platform.runLaterでスケジュールを設定しようとしても、プログレスバーは更新されません。ファイルの読み込みは同期処理の一部なので、独自のスレッドでリーダーを実行するだけではできません。スレッドが参加するまで待つ必要があります。プログレスバーは他の状況でも動作しています。私が試したもの:JavaFXアプリケーション:ファイルを読み込んでいる間バーで進行状況を表示

public CsvFile(File file, SEPARATOR separator) 
{ 
    this.file = file; 
    this.separator = separator.value(); 
    setPattern(); 

    Thread thread = new Thread() { 
     public void run() { 
      readFile(); 
     }; 
    }; 
    thread.start(); 
    try 
    { 
     Thread.sleep(5000);//HACK 
     thread.join();//HACK 
    } 
    catch (InterruptedException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

とreadFileの(によって呼び出され、プログレスバー方式、):

public void setProgressExecute(double progress) 

{ 
    //ProgressExecute.setProgress(progress); 
    Platform.runLater(new Runnable() { 
     @Override 
     public void run() { 
      ProgressExecute.setProgress(progress); 
     } 
    }); 
} 

更新

私は今それ自身のスレッドでnew CsvFileを呼び出しています。これにより、プログレスバーが機能します。しかし、JavaFXスレッドだけがGUIの特定の部分を更新する可能性があるため、Platform.runLaterを使用してGUIアップデートを実行する必要もあります。私の新しい問題はPlatform.runLaterにあります:処理の順番を逆転させるLIFO順のものを実行します。まあ、あなたはそれをすべて取ることができないと思います。

+1

バックグラウンドスレッドが現在のスレッドで完了するのを待っている場合はどうすればいいですか? 'Thread thread = new Thread(){'から 'catch'ブロックの最後までのコードは、基本的に' readFile() 'を呼び出すのと同じです。 –

+0

私は悲惨でした。私はスレッドをスリープ状態にすると、おそらくPlatform.runlaterが実行される可能性があると思ったが、それはうまくいかなかった。 – Adder

+0

オンになっている 'CsvFile'コンストラクタはどのスレッドですか? –

答えて

0

サービスクラス(LogFilesService extends Service)を作成し、progressPropertyをバインドすることができます。 Serviceクラスでは、updateProgressを使用して進行状況を更新できます。

関連する問題