2015-11-17 15 views
7

enter image description hereCome caricare il file fxml nel riquadro?

Se abbiamo un Stage poi Scene include 2 Pane s 1 ° Pane contiene Button e il 2 ° Pane è vuota potremmo caricare altro file fxml all'interno di questa seconda Pane?

fxml1: VBox 
       |_Pane1-->Button 
       |_Pane2 
/////////////// 
fxml2: Pane--> Welcome to fxml 2 
"when we click the button load the fxml2 inside Pane2 of fxml1" 

Poi, dopo click

enter image description here


==== Ho finalmente trovato questo funziona dopo aver provato! ==== Grazie ragazzi

@FXML Pane secPane; 
public void loadFxml (ActionEvent event) { 
Pane newLoadedPane =  FXMLLoader.load(getClass().getResource("/application/fxml2.fxml")); 
secPane.getChildren().add(newLoadedPane); 
} 
+0

È possibile caricare in modo dinamico un file fxml. Se la tua domanda è più complessa di quella, dovrai modificarla per aggiungere un po 'di più al tuo codice reale e quello che hai provato non ha funzionato. –

+0

Ci provo ma non funziona @FXML Pane secPane; public void loadFxml (evento ActionEvent) { secPane = FXMLLoader.load (getClass(). GetResource ("/ application/fxml2.fxml")); } –

+0

e quale errore specifico ricevi quando provi ad eseguirlo? –

risposta

6

Ho finalmente trovato questo funziona dopo aver provato!

@FXML Pane secPane; 
public void loadFxml (ActionEvent event) { 
    Pane newLoadedPane = FXMLLoader.load(getClass().getResource("/application/fxml2.fxml")); 
    secPane.getChildren().add(newLoadedPane); 
} 
0

Puoi implementare qualcosa del genere:

public void start(Stage primaryStage) throws IOException { 
      primaryStage.setTitle("Title"); 
      primaryStage.setScene(createScene(loadMainPane("path_of_your_fxml"))); 
      primaryStage.show(); 

    } 

    private Pane loadMainPane(String path) throws IOException { 
     FXMLLoader loader = new FXMLLoader(); 

     Pane mainPane = (Pane) loader.load(
       getClass().getResourceAsStream(path)); 

     return mainPane; 
    } 


    private Scene createScene(Pane mainPane) { 
     Scene scene = new Scene(mainPane); 
     return scene; 
    } 

Quindi è possibile creare una chiamata classe separata navigazione per memorizzare tutti i percorsi fxml:

public class Navigator { 

private final String P1; 
private final String P2; 
//then you can implement getters... 
public String getP1() { 
    return P1; 
} 

public String getP2() { 
    return p2; 
} 

private static FxmlController Controller; 

    public static void loadPane(String fxml) { 
    try { 
     FxmlController.setPane(
       (Node) FXMLLoader.load(Navigator.class.getResource(fxml))); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public Navigator() throws IOException { 
    this.P1 = "p1.fxml"; 
    this.P2 = "p2.fxml";} 

Quindi è possibile caricare il riquadro nel vostro pulsante mi piace qui sotto:

@FXML 
    private void btnAction(ActionEvent event) throws IOException { 
    Navigator.load(new Navigator().getP1()); 
    .. 

.

3

La semplice sostituzione del campo nella classe del controller non cambierà il grafico della scena.

secPane è solo un riferimento a un nodo nel grafico di scena.

Se secPane è solo un segnaposto, si potrebbe sostituirlo nell'elenco degli elementi secondari del genitore:

public void loadFxml (ActionEvent event) { 
    // load new pane 
    Pane newPane = FXMLLoader.load(getClass().getResource("/application/Login2.fxml")); 

    // get children of parent of secPane (the VBox) 
    List<Node> parentChildren = ((Pane)secPane.getParent()).getChildren(); 

    // replace the child that contained the old secPane 
    parentChildren.set(parentChildren.indexOf(secPane), newPane); 

    // store the new pane in the secPane field to allow replacing it the same way later 
    secPane = newPane; 
} 

Ciò presuppone, naturalmente, che getClass().getResource("/application/Login2.fxml") cede la risorsa corretta e non restituisce null (che succede se alcuna risorsa con il nome dato è disponibile)

Problemi correlati