2016-08-10 3 views
0

Heute bin ich auf ein Problem gestoßen, vielleicht könntest du mir erklären, warum es so geschrieben werden muss.JavaFx: Szenen wechseln (Elternausgabe)

Parent parent = FXMLLoader.load(getClass().getResource("/fxmlFiles/MainScreen.fxml")); 
Scene MainScene = new Scene(parent); 
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); 
stage.setScene(MainScene); 
stage.show(); 

Ich möchte Sie über die 3. Zeile dieses Codes (Szenenwechsel) fragen. Warum wird zuerst Stage und dann Node ausgegeben?

Warum können wir nicht es einfach wie folgt schreiben:

Parent parent = FXMLLoader.load(getClass().getResource("/fxmlFiles/MainScreen.fxml")); 
Scene MainScene = new Scene(parent); 
Stage stage = new Stage(scene); 
stage.setScene(MainScene); 
stage.show(); 

Parent ist nur irgendwie ein Layout von FXML Dateien zur Verfügung gestellt, nicht wahr? Wenn nicht mir bitte erklären, was es ist exacly: P

+0

Ich würde sehen müssen, wenn dieses Ereignis aufgerufen wird, aber das ist eine ziemlich übermäßig komplexe Möglichkeit, eine Szene zu wechseln. Wenn Sie die gleiche Bühne halten, müssen Sie nur die Szene auf der Bühne wechseln. Wenn Sie eine neue Bühne möchten, dann gehen Sie mit der zweiten Methode, die Sie gezeigt haben. – Dominic

Antwort

1

Warum haben sie zunächst von Stage gegossen werden und dann an den Node Object?

Das ist nicht, was passiert. Sieh dir die Klammern an. Sie rufen event.getSource() an und werfen das Ergebnis davon auf Node. Sie rufen dann getScene() über die Node, getWindow() über die resultierende Scene, und Gießen, dass Window zu einem Stage.

Der Code entspricht:

Object source = event.getSource(); 
Node node = (Node) source ; 
Scene scene = node.getScene(); 
Window window = scene.getWindow(); 
Stage stage = (Stage) window ; 

Warum können wir nicht es gerade schreiben fllowing Weg:

Parent parent = FXMLLoader.load(getClass().getResource("/fxmlFiles/MainScreen.fxml")); 
Scene MainScene = new Scene(parent); 
Stage stage = new Stage(scene); 
stage.setScene(MainScene); 
stage.show(); 

Das tut etwas anderes; es erstellt eine neue Stage, anstatt die Szene auf der bestehenden Bühne zu setzen. Verwenden Sie den Code, der der tatsächlichen Funktionalität entspricht, die gewünscht wird.

+0

Okey, ich verstehe. Welche Art von Daten erhalten wir, wenn wir die event.getSource() - Funktion verwenden? Warum müssen wir Casting verwenden? – Michael

+0

Lesen Sie die [Javadocs] (https://docs.oracle.com/javase/8/docs/api/java/util/EventObject.html?-external=true#getSource--). 'getSource' gibt ein' Object' zurück; die Quelle kann irgendein Objekt sein. –

+0

Okey, jetzt bin ich verwirrt; P. "Knoten sind Präsentationsobjekte. Sie haben Aktionen, Eigenschaften und lokalisierte Anzeigenamen - sie sind der Ort, an dem die Architektur auf den Menschen trifft. Knoten umschließen normalerweise ein Modellobjekt und stellen lesbare Namen, Symbole usw. bereit." Also, wenn Knoten wirklich auch Objekte sind, warum müssen wir Objekt auf ein Objekt werfen :(. Ich verstehe das nicht. – Michael

Verwandte Themen