2017-07-18 2 views
1

Ich lade eine Liste von FXML-Dateien über meine Main App. Aber ich habe ein Problem, das in TabPane mit seiner FX: ID angezeigt wird. Dieses TabPane befindet sich unter einem BorderPane. Ich bin in der Lage, das Zentrum der Grenze zu erreichen, aber ich kann nicht auf das TabPane darunter zugreifen.Von MainApp, wie Inhalt in einer fx: ID in einem anderen Controller in JavaFX angezeigt wird

hier ist mein Setup

In my start: 

    @Override 
     public void start(Stage primaryStage) { 
      this.primaryStage = primaryStage; 
      initRootLayout(); 
      showPersonOverview(); 
     } 
In my init 

     public void initRootLayout() { 
       try { 
        FXMLLoader loader = new FXMLLoader(); 
        loader.setLocation(MainApp.class 
          .getResource("view/RootLayout.fxml")); 
    //Note this line, I am setting up my rootLayout to be the 
    //mainBorderPane, but I want it to be an AnchorePane under the main 
//BorderPane 
        rootLayout = (BorderPane) loader.load(); 
        Scene scene = new Scene(rootLayout); 
        primaryStage.setScene(scene); 

        RootLayoutController controller = loader.getController(); 
        controller.setMainApp(this); 

        primaryStage.show(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

Hier ist, was ich mit einem Problem habe. Ich kann dies nicht in dem oben erwähnten TabPane anzeigen.

public void showPersonOverview() { 
     try { 
      FXMLLoader loader = new FXMLLoader(); 
      loader.setLocation(MainApp.class.getResource("view/PersonOverview.fxml")); 
      AnchorPane personOverview = (AnchorPane) loader.load(); 
      //Here I am displaying the personOverview inside the main boarderPane 
      rootLayout.setCenter(personOverview); 

      PersonOverviewController controller = loader.getController(); 
      controller.setMainApp(this); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

enter image description here

Antwort

1

hat Ihr RootLayoutController einen Verweis auf die Tabfeld, so definieren eine Accessor-Methode auf die Tabfeld von der Root-Controller und verwenden, wenn Sie neue Registerkarten hinzufügen möchten.

// Store a reference to your root controller in your application. 
RootLayoutController rootController; 
... 

// in initRootLayout() 
... 
rootController = loader.getController(); 
... 

// in showPersonOverview() 
... 
AnchorPane personOverview = (AnchorPane) loader.load(); 
rootController.getTabPane().getTabs().add(
    new Tab("Person Overview", personOverview) 
); 
... 

Die rootController sind einfach:

@FXML tabPane; 

public TabPane getTabPane() { 
    return tabPane; 
} 

Alternative Lösung unter Verwendung von Knoten-Lookups

Alternativ können Sie auch den Einsatz node.lookup() Funktionen basierend auf einem CSS-ID-Selektor, aber im allgemeinen können, die Verwendung von Referenzen wie oben ist wahrscheinlich besser als Nachschlagewerke, da die Referenzen typsicher sind und nicht den Runtime-Launen von css-Lookups unterliegen. CSS-Lookups funktionieren manchmal nur wie erwartet, nachdem Sie Elemente zu einer Szene hinzugefügt haben und applied a css and layout pass.

+0

rootController.getTabPane(). GetTabs() Ich sehe keine getTabs? meinst du getChildern? Wir haben das @FXML tabPane. das bekommen wir über getTabPane. getTabs füllt nicht für mich. – Moe

+0

getChildren arbeitete für mich. Vielen Dank!! – Moe

+0

Nein, ich meinte nicht "getChildren()". Ein 'TabPane' hat eine [' getTabs() '] (https://docs.oracle.com/javase/control/TabPane.html#getTabs--), Methode, die ist was ich in diesem Beispiel benutzt habe. Wenn Sie eine alternative Lösung gefunden haben, die für Sie arbeitet, ist das großartig. – jewelsea

Verwandte Themen