2017-07-26 44 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自己的線程。這使得進度條工作。但是,它也迫使我使用Platform.runLater來運行GUI更新,因爲只有JavaFX線程可能會更新GUI的某些部分。我的新問題是Platform.runLater:它以LIFO順序運行東西,這顛倒了處理的順序。那麼我想你不能擁有一切。

+1

如果您只是要等待它在當前線程中完成,那麼使用後臺線程有什麼意義?你的代碼從'Thread thread = new Thread(){'直到'catch'塊的末尾,基本上等同於簡單地調用'readFile()'。 –

+0

好吧,我絕望了。我認爲如果我睡覺的話,也許Platform.runlater會有機會運行,但這不起作用。 – Adder

+0

調用'CsvFile'構造函數的線程是什麼? –

回答

0

您可以創建一個服務類(LogFilesService extends Service)並綁定progressProperty。 在Service類中,您可以使用updateProgress更新進度。