別のスレッドを入力する前に、GUIを更新してください -- java フィールド と multithreading フィールド と controller フィールド と java-8 フィールド と fxml フィールド 関連 問題

JavaFX Update GUI Before Entering Another Thread












1
vote

問題

日本語

編集:

私の質問が別の質問にリンクされていることに気づきました。私たちの目標は似ていますが、他の質問の設定は異なります。プログラムのメインクラス内のプログラムのすべてのGUIの側面を作成しているため、スタートメソッド内でボタンのトリガイベントも設定しています。したがって、タスクの作業に結合された「SetOnAction(Event-≫」を使用する解決策は、新しい単一クラスプログラムを作成した場合、ソリューションの作業を行うことができました。私の状況のた​​めに私は

私のセットアップでは、このイベントをメインクラスから実行していませんが、私のFXMLにリンクされているコントローラクラスの外には、すでに定義されているイベントがあります。不要に見えたように、コントローラクラス全体を投稿しませんでした。リンクされている質問の解決策を作成する方法がある場合は、私の異なるセットアップのために作業するか、恒星になるでしょう。リンクされている質問から取って「タスク」セットアップを調べましたが、以下のように描かれているようにうまく機能するようになることができなかった:

<事前> <コード> @FXML private void goForIt(ActionEvent event) { kickTheBaby(); } private void kickTheBaby() { java.util.Date now = calendar.getTime(); java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime()); statusFld.setOnAction(event -> {statusFld.setText("Running"); Task task = new Task<Void>() { @Override public Void call() { (new Thread(new EmailCommunication("", currentTimestamp, "START"))).start(); (new Thread(new DataGathering2())).start(); return null; } }; task.setOnSucceeded(taskFinishEvent -> statusFld.setText(statusFld.getText() + "All done time to sleep...")); new Thread(task).start(); }); }

データをダウンロードして解析するFXMLを使用してJava8にプログラムを持っています。プログラムをGUI TextField(ここでは "statusfld"という)を更新して、スタートボタンをクリックしたときに "Running"を言うようにしたいと思います。以下は、この一連のイベントを担当する必要があるコントローラの方法です。

<事前> <コード> @FXML private void goForIt(ActionEvent event) { statusFld.setText("Running!"); java.util.Date now = calendar.getTime(); java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime()); (new Thread(new EmailCommunication("", currentTimestamp, "START"))).start(); (new Thread(new DataGathering2())).start(); }

しかし、プログラムを実行しようとすると、GUIは視覚的に更新されず、他の2つのスレッドにまっすぐになります。そのため、ステータスフィールドをSOに渡すことで、他のスレッドの1つで「Platform.Runlater()」の方法論を使用しようとしました。

<事前> <コード> Platform.runLater(() -> { statusFld.setText("Running!"); });

しかし20分後にGUIに視覚的な更新を与えなかった。私の推測は、これがおそらく私がそれをすることができるデータ処理の莫大な量が原因であるということです。それで誰が「後で」がこの場合に何があるかを知っています。

私の質問は、他のものに移動する前にGUIが視覚的に更新されることを確信していますか。

ありがとうございました!

英語

EDIT:

I noticed that my question was linked to another. While our goals are similar, the other question's set up is different: they are creating all the GUI aspects of the program within the main class of their program, they are also setting the trigger event of the button press within the start method. Therefore the solution of using the "setOnAction(event->" coupled with Task works. It is a single class program, I was able to make the solution work if I created a new, single class program, this application does not work for me for my situation.

In my set up I am not running this event out of the main class, but out of the Controller class that is linked to my FXML and I have the event that triggers the method already defined. I did not post my entire Controller class as that seemed unnecessary. If there is a way to make the linked question's solution work for my different set up, or a link for guidance that would be stellar. I have looked into the "task" set up, taking from the linked question, but so far have not been able to get it to work successfully as pictured below:

    @FXML private void goForIt(ActionEvent event)  {     kickTheBaby(); }  private void kickTheBaby() {    java.util.Date now = calendar.getTime();    java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime());     statusFld.setOnAction(event -> {statusFld.setText("Running");     Task task = new Task<Void>() {             @Override             public Void call()              {                 (new Thread(new EmailCommunication("", currentTimestamp, "START"))).start();                 (new Thread(new DataGathering2())).start();                 return null;             }         };         task.setOnSucceeded(taskFinishEvent -> statusFld.setText(statusFld.getText()      + "All done time to sleep..."));         new Thread(task).start();     }); } 

I have a program in Java8 using FXML that downloads and parses data. I wish to make the program update the GUI TextField (called "statusFld" here) to say "Running" when I click the start button. Below is the method in the controller that should be responsible for this series of events.

 @FXML private void goForIt(ActionEvent event)  {     statusFld.setText("Running!");      java.util.Date now = calendar.getTime();     java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime());     (new Thread(new EmailCommunication("", currentTimestamp, "START"))).start();     (new Thread(new DataGathering2())).start();  } 

However, when I attempt to run the program the GUI does not visually update and goes straight into the other two threads. So I attempted to utilize the "Platform.runLater()" methodology in one of the other threads by passing the status field to it as so:

Platform.runLater(() ->   {     statusFld.setText("Running!"); }); 

But after 20 minutes it had not given a visual update to the GUI. My guess is that this is probably due to the sheer amount of data processing that I am having it do, so who knows what "later" will actually be in this case.

My question is how can I be sure that the GUI visually updates before moving on to the other, very processing intense, threads?

Thank you!

</div
              
 
 

回答リスト


関連する質問

0  JavaFXでOnMouseEnteredイベントでSVGパスを補充します  ( Refill a svg path with onmouseentered event in javafx ) 
.FXML文書(NetBeansを含む.svgファイルから作成された)を含む個人プロジェクトに取り組んでいます。これはマップあなたができるようにmoneover、すべての領域は.fxmlファイルのSVGパスに変換されます。ただし、コントローラクラスを使用して...

0  テキストが変更されたときに、ラベル付きコントロールが他のコンポーネントのサイズ変更を防ぐ方法  ( How do i prevent a labeled control from resizing other components when its text ) 
タイトルが示すように、javafx.scene.control.labelのテキストを変更すると、同じレイアウトに含まれているすべてのコンポーネントのサイズを変更します。これを防ぐにはどうすればいいですか?これが私のFXMLマークアップです: <事前> <コー...

1  FXMLレイアウトの再利用可能な定数?  ( Reusable constants for fxml layouts ) 
これは私の前のフォローアップです。質問。どういうわけか、私は私の質問のための解決策を手に入れました、 が本当に私の質問に答えたことはありません。この質問をするために。 これが理由があります: FXMLLoader.namespace を使用して、マッピン...

1  コントローラ間のJavaFX通信  ( Javafx communication between controllers ) 
JavaFX の新機能であるため、2つのコントローラ間でデータを共有するのに役立ちます。 シンプルなメニューを持つシンプルなウィンドウがあります: <事前> <コード> @FXML Label labelLabel; @FXML MenuItem sbo...

0  JavaFX 2.2 FXMLによって生成されたLineChartのDateAxisのSetLowerBoundとSetupPerboundの方法  ( Javafx 2 2 how to setlowerbound and setupperbound in dateaxis in linechart gener ) 
私はwhit javafxシーンビルダーが私のアプリケーションのレイアウトを作成しました。 LineChartでは、日付によっていくつかのグラフを宣言します。デフォルトでは、JavaFX LineChartは日付をサポートしていません。だから私はこのlibra...

1  @FXMLを採用したプロパティは、Spring SecurityとJavaFXを使用するとNULLです。  ( Property anottated with fxml is null when i use spring security and javafx ) 
Spring Securityを有効にしたJavaFXアプリケーションを開発しています。次に、IDのTextFieldを持つFXMLフォームをTXTFieldに登録しました。後で@ Secured anottationを使用したメソッドを獲得しましたが、テキ...

5  JavaFX 2 - 親オブジェクトをFXMLファイルに書き込みます  ( Javafx 2 write parent object to fxml file ) 
FXMLファイルを以下の親オブジェクトにロードできることを知っています。 <事前> <コード> parent = FXMLLoader.load(getClass().getResource(fxmlFile.getAbsolutePath()));...

32  JavaFXツールチップの遅延を制御する方法  ( How to control the javafx tooltips delay ) 
私は javafx's Tooltip 。私は個人的に何か上のホバリングと実際に現れるツールチップの間の遅れが長すぎることに気づいた。 APIの外観は明らかにされています: 通常、ツールチップはコントロールを越えて移動すると「起動」されます。ツールチップ...

2  JavaFXの形状は動的にサイズ変更されています  ( Javafx shape resize dynamically ) 
ステージがサイズ変更されているときにサイズが変更されたストロークを持つアンカーパンを持つ必要があります。 私はこれを塗りつぶし色とアルファ= 0(その透明)を持つ長方形を使用してこれを達成しました、これは私のfxmlファイルです: <事前> <コード> ...

0  CheckComboboxの選択肢は空です  ( Checkcombobox choices are empty ) 
こんにちは私はJavaFXを学んでいて、複数選択のドロップダウンを作成したいです。 CheckComboboxを使用する必要があると思います。私はそれを実装しますが、要素を見せなかった。これが私のコード: fxml:<コード> <CheckComboBox ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有