it-swarm.com.de

Wie lade ich die fxml-Datei in Pane?

 enter image description here

Wenn wir eine Stage haben, enthält Scene 2 Panes Die 1. Pane enthält Button und die 2. Pane ist leer Können wir andere fxml-Dateien in diese 2. Pane laden?

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

Dann nach Klick

 enter image description here


==== Ich habe endlich herausgefunden, dass dies funktioniert, nachdem ich es versucht habe! ==== Danke, Leute

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

Ich habe endlich gefunden, dass das funktioniert, nachdem ich es versucht habe!

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

Das Ersetzen des Felds in Ihrer Controller-Klasse ändert nichts an dem Szenendiagramm.

secPane ist nur eine Referenz auf einen Knoten im Szenendiagramm.

Wenn secPane nur ein Platzhalter ist, können Sie ihn in der untergeordneten Liste des übergeordneten Elements ersetzen:

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;
}

Dies setzt natürlich voraus, dass getClass().getResource("/application/Login2.fxml") die korrekte Ressource ergibt und null nicht zurückgibt (was passiert, wenn keine Ressource mit dem angegebenen Namen verfügbar ist).

4
fabian

Sie können so etwas implementieren:

 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;
    }

Dann können Sie einen separaten Klassenaufruf Navigation erstellen, um alle Ihre fxml-Pfade zu speichern:

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";}

Dann können Sie Ihren Bereich wie folgt in Ihre Schaltfläche laden:

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

.

0
Madushan Perera