2016-04-25 31 views
1

GUIが設定されている環境を作成しようとしていて、ユーザーがリスナーを介してコンポーネントを変更している間に、別のスレッドがX秒。別のクラスの別のスレッドからJavaFX GUIを変更する

私は、ゲームを1つのクラスにし、 "要素加算器"スレッドを別のスレッドに入れたいと思います。もちろん、JavaはJavaFX GUIを別のスレッドから変更できないと言っています。

私はPlatform.runLater()しかし、私の知る限り見るように、すべてのこれらのソリューションは匿名内部クラスを使用するを使用してソリューションを見てきました。そして、私は本当に私の加法者が別の(名前のついた)クラスに入ることを望んでいます。

任意のヒントが本当にいただければ幸い、ここで問題を再現するコード、最小限のバージョンがあります:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 

public class DifferentThreadJavaFXMinimal extends Application { 

    private Thread t; 
    private GridPane gp; 

    public static void main(String[] args){ 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     gp = new GridPane(); 
     Scene gameScene = new Scene(gp, 600,500); 
     primaryStage.setScene(gameScene); 

     t = new Thread(new Thread2(instance())); 




     primaryStage.show(); 
     t.start(); 
    } 
    void addElement(int i) { 
     Button actualButton = new Button("TEST"); 
     gp.add(actualButton,i,i); 
    } 
    public DifferentThreadJavaFXMinimal instance(){ 
     return this; 
    } 

} 

class Thread2 implements Runnable { 
    private DifferentThreadJavaFXMinimal d; 

    Thread2(DifferentThreadJavaFXMinimal dt){ 
     d=dt; 
    } 

    @Override 
    public void run() { 
     for (int i=0;i<4;i++) { 
     d.addElement(i); 
     } 
    } 

} 

答えて

1

あなたはまだあなたのスタンドアロンのクラスを使用することができます。

UIの変更は、FXアプリケーションスレッドで行われる必要があります。 Platform.runLater(...)に渡すUIを変更する他のスレッドからの呼び出しを、Runnableにラップすることで、この問題が発生する可能性があります。あなたのコード例で

、あなたはどうなるのでd.addElement(i)は、UIを変更します。

class Thread2 implements Runnable { 
    private DifferentThreadJavaFXMinimal d; 

    Thread2(DifferentThreadJavaFXMinimal dt){ 
     d=dt; 
    } 

    @Override 
    public void run() { 
     for (int i=0;i<4;i++) { 
      final int value = i ; 
      Platform.runLater(() -> d.addElement(value)); 
      // presumably in real life some kind of blocking code here.... 
     } 
     System.out.println("Hahó"); 
    } 

} 
+0

はあなたに非常に多くのJames_Dをありがとう、それが現実現実のソリューションを把握するために私にしばらく時間がかかったが、あなたの提案は証明しましたパズルの欠けている部分になる! おかげで再び! –

関連する問題