java.lang.IllegalStateException: Not on FX application thread Calling Function
<p>Something strange is happening.. Untill 10 minutes ago I had no problem with this code. But now I have a problem updating JUST my VBOX from an external thread.</p>

<p>These are my three classes:</p>

<p>Controller Class:</p>

<pre><code>public class Controller implements Initializable{
@FXML
private VBox slaveVbox;

private ButtonBar newNode = new ButtonBar();
private Circle c= new Circle();
private Button b= new Button();
private Label lname = new Label();
private Label lIMEI = new Label();
private Label lroot = new Label();

@Override
public void initialize(URL location, ResourceBundle resources) {
}

public void create(String imei, String permission,boolean isOnline) throws IOException{
    if(!alreadyExist(imei)){
    newNode = new ButtonBar();
    b = setButtonSpec(imei + "btnHavefun");
    c = setCircleSpec(imei + "statuOnline", isOnline);
    lname= setLNameSpec(imei + "name");
    lIMEI = setLIMEISpec(imei + "Imei");
    lroot = setLrootSpec(imei + "root", permission);
    newNode.getButtons().addAll(lname,lIMEI,lroot,b,c);
    slaveVbox.getChildren().addAll(newNode);
   }
  }
}
</code></pre>

<p>Main Class:</p>

<pre><code>public class MainApp extends Application {
 FXMLLoader loader2;
 private Stage primaryStage;
 private BorderPane rootLayout;

@Override
public void start(Stage primaryStage) throws IOException {
    this.primaryStage = primaryStage;
    this.primaryStage.setTitle("Thypheon Application");
    initRootLayout();
    Controller controller2 = initDesign();
    Connection con = new Connection(controller2);
    Thread t = new Thread(con);
    t.start();

    primaryStage.setOnCloseRequest(new EventHandler&lt;WindowEvent&gt;() {
           @Override
           public void handle(WindowEvent e) {
              Platform.exit();
              System.exit(0);
           }
        });
}

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

public void initRootLayout(){
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("RootLayout.fxml"));
        rootLayout = (BorderPane) loader.load();
        Scene scene = new Scene(rootLayout);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public Controller initDesign(){
    try {
        FXMLLoader loader2= new FXMLLoader(getClass().getResource("Design.fxml"));
        AnchorPane anchor  = (AnchorPane) loader2.load();
        rootLayout.setCenter(anchor);
        Controller controller = loader2.getController();
        return controller;

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }

}


public Stage getPrimaryStage(){
    return primaryStage;
}

 }
</code></pre>

<p>Connection THREAD:</p>

<pre><code>public class Connection implements Runnable {
 String result;
 Controller controller;

   public Connection(Controller controller) {
       this.controller = controller;
   }

@Override
public void run() {
        try {
            controller.create("jhgjhgjh", "dssf", true);
    } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 }
</code></pre>

<p>Debugging the Application Everything works perfectly untill I reach <code>slaveVbox.getChildren().addAll(newNode);</code> Here comes the exception.. 
After some attempt to solve the problem I figured out that if I create a ButtonBar and I insert it in the slaveVbox from Main (inside start()) it works fine.. So I ve tied to add <code>controller2.create("FIRST", "FIRST", true);</code> in my start() function like this:</p>

<pre><code>@Override
public void start(Stage primaryStage) throws IOException {
    this.primaryStage = primaryStage;
    this.primaryStage.setTitle("Thypheon Application");
    initRootLayout();
    Controller controller2 = initDesign();
    controller2.create("FIRST", "FIRST", true);
    Connection con = new Connection(controller2);
    Thread t = new Thread(con);
    t.start();

    primaryStage.setOnCloseRequest(new EventHandler&lt;WindowEvent&gt;() {
           @Override
           public void handle(WindowEvent e) {
              Platform.exit();
              System.exit(0);
           }
        });
}
</code></pre>

<p>But obviously my application shows two ButtonBars... One created in the start() function and one created inside the Connection Thread.. How Can I avoid this?? Why I can't directly add item inside my VBox directly from my Connecton thread??</p>