2012-04-11 14 views
4

Ich möchte den Controller aus einer Szene holen, die ich mit FXMLoader geladen habe. Der Anwendungsfall ist:JavaFX 2.0 + FXML. Aktualisieren von Szenenwerten von einer anderen Task

  1. Mein JSON-Manager erhält ein JSON-Objekt
  2. Die Aufgabe, die ich ins Leben gerufen habe eine neue Szene

    Parent p = FXMLLoader.load(getClass().getResource("foo.fxml")); 
    Scene scene = new Scene(p); 
    stage.setScene(scene); 
    

    Danach verwenden, i die leere Szene hat.

  3. Jetzt kann ich das die Komponenten

    AnchorPane pane = (AnchorPane)((AnchorPane) scene.getRoot()).getChildren().get(0); 
    for(Node node : pane.getChildren()){ 
        String id = node.getId(); 
        if(id.equals(NAME)){ 
         ((TextField)node).setText(value); 
        } 
    } 
    

Meine Frage zu füllen, ist es ein einfacher Weg, dies zu tun? Ich habe einen Controller in FXML angegeben

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="526.0" minWidth="356.0" prefHeight="526.0" prefWidth="356.0" 
xmlns:fx="http://javafx.com/fxml" fx:controller="bar.foo"> 

Ich möchte die Instanz mit den bind Werte erhalten (TextField- in diesem Fall genannt Name)

Vielen Dank im Voraus

Antwort

14

1) Sie können den Controller erhalten von der FXMLLoader aber nicht wissen, ist es möglich, von Scene:

FXMLLoader fxmlLoader = new FXMLLoader(); 
Pane p = fxmlLoader.load(getClass().getResource("foo.fxml").openStream()); 
bar.foo fooController = (bar.foo) fxmlLoader.getController(); 

die fooController später nutzen zu können, In einem anderen Teil Ihres Codes können Sie Node#setUserData() verwenden. Zum Beispiel nach dem obigen Code:

p.setUserData(fooController); 
... 
// after a while of app logic and code 
bar.foo controller_of_p = (bar.foo) p.getUserData(); 

Dies gibt einen Workaround und eine Abkürzung, um Ihr Ziel zu erreichen.

2) Wenn Ihr Knoten eine ID hat, dann können Sie direkt Node#lookup() es, anstatt den Bau einer for-Schleife:

TextField txt = (TextField) pane.lookup("#nodeId"); 
+0

Vielen Dank für Ihre Antwort, es war ein Punkt mit node.lookup. Die Art, wie Sie den Controller aufrufen, funktioniert bei mir nicht, weil ich die aktuelle Controller-Instanz brauche. Auf diese Weise wird ein neuer Controller und ein neuer Bereich erstellt. – Javier

+0

warum? Verwenden Sie diesen Code anstelle von 'FXMLLoader.load (getClass(). GetResource (" foo.fxml "));' und Sie erhalten den gleichen Bereich wie in Ihrem Code. –

+0

@Javier. Die Antwort wurde aktualisiert. Bitte guck dir das an. –