我正在使用JavaFX 8来尝试创建在单独的线程上运行并位于同一舞台/窗口上的Panes。这是我的代码的逻辑:
public class Main extends Application {
VBox vbxMain;
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) throws Exception {
vbxMain = new VBox(10d);
addLabel(new HBox(new Label("LABEL")));
new Thread(new Threader(this)).start();
new Thread(new Threader(this)).start();
stage.setScene(new Scene(vbxMain, 100, 100));
stage.show();
}
public void addLabel(Pane node) {
vbxMain.getChildren().add(node);
}
}
public class Threader implements Runnable {
Main main;
public Threader(Main main) {
this.main = main;
}
@Override
public void run() {
Label lblText = new Label("Hello");
HBox hbxMain = new HBox(lblText);
main.addLabel(hbxMain);
}
当我运行它时,有时会显示:
LABEL
Hello
Hello
没有错误,但有时它只显示一个Hello或没有Hellos。 错误是:
Exception in thread "Thread-5" Exception in thread "Thread-4" java.lang.IllegalArgumentException: Children: duplicate children added: parent = VBox@36269e7b
at javafx.scene.Parent$2.onProposedChange(Unknown Source)
at com.sun.javafx.collections.VetoableListDecorator.addAll(Unknown Source)
at test3.Main.addLabel(Main.java:32)
at test3.Threader.run(Threader.java:18)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalArgumentException: Children: duplicate children added: parent = VBox@36269e7b
at javafx.scene.Parent$2.onProposedChange(Unknown Source)
at com.sun.javafx.collections.VetoableListDecorator.addAll(Unknown Source)
at test3.Main.addLabel(Main.java:32)
at test3.Threader.run(Threader.java:18)
at java.lang.Thread.run(Unknown Source)
请注意,在我的实际代码中,提供“Label lblText”的是另一个我初始化然后调用方法来检索VBox的类。
那么为什么有时只会出现错误,我该如何解决这个问题并且有更好的方法。
答案 0 :(得分:0)
如果需要从应用程序(主)线程以外的任何其他部分执行,则需要使用Platform.runLater()操作GUI的任何部分。