有时“重复儿童添加”错误,有时不会

时间:2015-10-11 09:01:20

标签: java javafx javafx-8

我正在使用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的类。

那么为什么有时只会出现错误,我该如何解决这个问题并且有更好的方法。

1 个答案:

答案 0 :(得分:0)

如果需要从应用程序(主)线程以外的任何其他部分执行,则需要使用Platform.runLater()操作GUI的任何部分。