我正在尝试创建一个设置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);
}
}
}
答案 0 :(得分:2)
您仍然可以使用独立课程。
规则是必须在FX应用程序线程上更改UI。您可以通过包含来自其他线程的调用来实现这一点,这些线程会更改您传递给Runnable
的{{1}}中的UI。
在您的示例代码中,Platform.runLater(...)
更改了用户界面,因此您可以执行以下操作:
d.addElement(i)