Java FX Layouts übereinander statt nebeneinander

mugsawaay

Aktives Mitglied
Hallo,
ich habe 2 identisch grosse "Views" auf AnchorPanes, bestückt mit Label, Buttons, choiceBoxes, etc.
Diese werden nach dem Programmstart auf einer "BasisPane" nebeneinander gesetzt.
Das funktioniert auch alles wie es soll.
Die beiden "Views" möchte ich nun übereinander anstatt nebeneinander legen, sodass immer nur eine View sichtbar ist.
Sämtliche Daten sollen aber erhalten bleiben. Einen Button auf der "BasisPane" soll zwischen den Views switchen.
Ich hatte mal mit einer StackPane ein wenig gespielt, aber so richtig weiter bin ich da nicht gekommen.
Vielleicht hat ja jemand schon so etwas mal gemacht
Danke gü
 
Verwende als BasisPane ein BorderPane und adde immer nur die Center.

Hier ein etwas schmutziges Beispiel mit einem ToggleButton.
( wirklich nur schnell schnell geschrieben!! )
Java:
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;


public class Main extends Application {
  
    public BorderPane pane1, pane2;
    public ToggleButton btnSwitch;
    private BorderPane root;
  
    @Override
    public void start(Stage primaryStage) {
        try {
            pane1 = new BorderPane(new Label("Das ist die ERSTE Maske"));
            pane2 = new BorderPane(new Label("..und das die ZWEITE"));
          
            btnSwitch = new ToggleButton("zu pane2 wechseln");
            btnSwitch.selectedProperty().addListener(new ChangeListener<Boolean>() {
                @Override
                public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                    boolean stateSeleceted = newValue;
                    if(stateSeleceted){
                        root.setCenter(pane2);
                        btnSwitch.setText("zu pane1 wechseln");
                    }else{
                        root.setCenter(pane1);
                        btnSwitch.setText("zu pane2 wechseln");
                    }
                }
              
            });
          
            root = new BorderPane();
            root.setCenter(pane1);
            root.setTop(btnSwitch);
            Scene scene = new Scene(root,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
  
    public static void main(String[] args) {
        launch(args);
    }
}
 
Ich verwende ebendfalls am liebsten entweder BorderPane oder StackPane als Root. Und wenn der innere Teil dynamisch sein soll, wie @thet1983 es beschreibt, verändere ich den Center eines BorderPane.

Um sinnvoll mit StackPanes arbeiten zu können ist es meist sinnvoll, a) die nicht anzuzeigende UI #setVisible(false) und #setManaged(false) zu setzen und mit #toFront() das anzuzeigende Layout "nach vorne" zu holen.
 

Neue Themen


Zurück
Oben