2017-02-10 6 views
0

javafx UIスレッドでいくつかの重い持ち上げが行われている間に、進行状況インジケーター(回転していない状態)を表示する可能性はありますか?GUIスレッドの重い作業中にプログレスインジケーターを表示する必要があります

Backstory: Iveはかなり大きなtableViewをTitledPane(数秒かかる)に読み込まなければなりません。全体を遅らせるコマンドは、TitledPane.setContent(myTableView)です。 だから私は、少なくともこの時間の間にいくつかの読み込みアニメーションやインジケータを表示したいです。

だから、今は高価な呼び出しを行う前に、私のロードアニメーションを表示するには息をUIスレッドの十分な余地を与えるために、次の操作を行ってイム:

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

これが示す進行状況インジケータを取得する動作しますが、一度UIのスレッドがsetContentで動作し始め、スタックしています。

iveは、アニメーションと一緒にレイオーバやダイアログを表示するためにスイングを使用している人が、別のスレッドで動作していて止まらないように見えましたが、まだ説得力のある解決策は見つかりませんでした。

EDIT: 問題の根本が見つかりました。 これで、テーブルにprefHeightPropertyが表示されているリストのサイズにバインドされています。JavaFX - Adapt TableView height to number of rows これは数週間前に働いて忘れました。

これは多くの時間がかかります。だから、バインディングを設定するときに時間を要することはありませんが、時間がかかることを示していますが、テーブルが大きくなっているときにuiスレッドに大きな問題があるようです。

jamesのおかげで、彼の答えはこの種の問題に遭遇する大部分の人にとって正しいものになります。

誰かがあそこにこの問題をコメントしてくださいすることができます:JavaFX - Adapt TableView height to number of rows (これは私は十分に担当者を持っていけない最初の質問ですので、まだコメントすること。)

+0

'titledPane.setContent(myTableView);'現実的にどんなかなりの時間を割いてすることはできません。コード内で起こっている何かが時間を費やしています。おそらくデータをロードしています。時間のかかる作業(実際のUI作業ではない)をバックグラウンドスレッドに移行する必要があります。 –

答えて

1

をバックグラウンドスレッドで実行されている、Taskにデータをロードします。タスクの開始時に読み込みアニメーション(または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 ... doesntが全体的に全体をとっていることがわかりました。 今深く掘り下げた後、私はこの混乱の原因を見つけました。これで内容に合わせてテーブルの高さを調整しています。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のバインドは遅く、速くなくて済みます。 私は小さなexampeをハックアップし、複製してここに投稿しようとします。 – 84n4n4

関連する問題