从不同类中的不同线程修改JavaFX gui

时间:2016-04-25 20:15:38

标签: java multithreading user-interface javafx javafx-2

我正在尝试创建一个设置GUI的环境,当用户通过侦听器修改其组件时,另一个线程每隔X秒向其添加一个新元素。 (这是游戏,是的)

我希望游戏在一个类中,并且"元素加法器"另一个线程 - 当然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 个答案:

答案 0 :(得分:2)

您仍然可以使用独立课程。

规则是必须在FX应用程序线程上更改UI。您可以通过包含来自其他线程的调用来实现这一点,这些线程会更改您传递给Runnable的{​​{1}}中的UI。

在您的示例代码中,Platform.runLater(...)更改了用户界面,因此您可以执行以下操作:

d.addElement(i)