2017-02-10 76 views
0

在javafx ui線程中完成一些繁重的工作時,是否可以顯示(旋轉,未卡住)進度指示器?在GUI線程繁重的工作中顯示ProgressIndicator

Backstory: 我必須加載一個相當大的tableView到一個TitledPane(需要幾秒鐘)。使整個事情滯後的命令是TitledPane.setContent(myTableView)。 所以我想在這段時間至少顯示一些加載動畫或指標。

所以現在即時通訊執行以下操作,給UI線程足夠的空間來呼吸做昂貴的調用之前顯示我的加載動畫:

showMyLoadingAnimation(); 
PauseTransition pause = new PauseTransition(Duration.seconds(1)); 
pause.setOnFinished(event -> { 
    setContent(myTableView); 
}); 
pause.play(); 
dismissMyLoadingAnimation(); 

這個作品得到顯示的進度指示器,但一旦UI線程開始工作setContent它卡住了。我看到有些人使用swing來顯示平移或對話的動畫只是爲了讓它在不同的線程中運行並且沒有卡住,但還沒有找到一個有說服力的解決方案。

編輯: 好的,我發現問題的根源。 所以我得到的表prefHeightProperty綁定到它顯示的列表大小,如下所示:JavaFX - Adapt TableView height to number of rows 在那個星期前做了,工作,忘記了它。

花費很多時間。所以雖然在設置綁定時計時調用並不表明需要大量時間,但當表變得越來越大時,ui線程似乎遇到了大問題。

感謝詹姆斯,他的回答對大多數遇到這種問題的人來說是正確的。

可有人請評論這個問題在那裏:JavaFX - Adapt TableView height to number of rows (因爲這是第一個問題,我沒有足夠的代表尚未就此發表評論。)在Task

+0

'titledPane.setContent(myTableView);'實際上不可能採取任何可觀的時間。代碼中發生的其他事情正在花時間;可能會加載數據。您應該將耗時的工作(這不是實際的UI工作)轉移到後臺線程。 –

回答

1

加載數據,在後臺線程中運行。在啓動任務時顯示加載動畫(或ProgressIndicator等),並在任務完成時將其刪除。

的基本思路是這樣的:

TableView<MyDataType> table = new TableView<>(); 
// set up columns... 

Task<List<MyDataType>> loadDataTask = new Task<List<MyDataType>>() { 
    @Override 
    protected List<MyDataType> call() throws Exception { 
     List<MyDataType> data = ... ; 
     // load data and populate list ... 
     return data ; 
    } 
}; 
loadDataTask.setOnSucceeded(e -> table.getItems().setAll(loadDataTask.getValue())); 
loadDataTask.setOnFailed(e -> { /* handle errors... */ }); 

ProgressIndicator progressIndicator = new ProgressIndicator(); 
table.setPlaceHolder(progressIndicator); 

Thread loadDataThread = new Thread(loadDataTask); 
loadDataThread.start(); 
+0

嗨! 我已經在那裏。但我用你的代碼再次嘗試,但無濟於事。 準備數據不是一個大問題,它已經存在了,我發現table.getItems()。set ...並不需要那麼長時間。 現在深入挖掘後,我發現這混亂的罪魁禍首,我一直在調整表的高度,以適應內容與此http://stackoverflow.com/questions/27945817/javafx-adapt-tableview-height-to-number-通過將表的prefHeightProperty綁定到列表的大小來創建行 。 呼叫本身並沒有花費那麼長時間(嘗試計時),但是如果我將它評論爲突然很快。 – 84n4n4

+0

@ 84n4n4我不明白'table.getItems()。setAll(...)'需要多長時間。我沒有在後臺線程中運行'getItems()。setAll(...)',我在後臺線程完成後在FX應用程序線程上運行它。顯然,即使你將表的高度與項目列表的大小綁定在一起(我認爲這不是一個足夠強大的解決方案),如果你僅僅改變一次列表(用'setAll(。 ..)')而不是每次添加每個元素,這也不是問題。聽起來你需要弄清楚實際問題是什麼。 –

+0

對於混淆感到抱歉。準備數據不是時間問題。設置表中的數據不是時間問題。在我的窗格中設置一個空的或小的表格不是時間問題。 但是當擁有大量數據的時候整個事情就會崩潰。 >>如果您只更改列表一次(使用setAll(...)),而不是一次添加每個元素,那也不是問題。 這正是我在做的事情,與prefHeight綁定它的速度很慢,沒有它的速度。 我會破解一個小例子,並嘗試在這裏複製併發布它。 – 84n4n4

相關問題