Größe von Scene und stage an grid anpassen

rhilge

Mitglied
Hallo,
ich erzeuge mir durch das eingeben von x- und y-Wert ein gridpane mit x Spalten und y Zeilen. In jedem Feld befindet sich ein Button.

Nun erzeuge ich mit folgendem Code zunächst zwei Editfelder und einen Button zum bestätigen:

Code:
        primaryStage.setTitle("Test");
        Group group = new Group();
        group.setLayoutY(10);
        TextField spalten = new TextField("x");
        spalten.setPrefWidth(30);
        TextField zeilen = new TextField("y");
        zeilen.setLayoutX(10);
        zeilen.setPrefWidth(30);
        spalten.setLayoutX(zeilen.getLayoutX() + 50);
        Button eingabe = new Button("Bestätigen");
        eingabe.setLayoutX(spalten.getLayoutX() + 50);
        eingabe.setPrefWidth(100);
        group.getChildren().addAll(zeilen, spalten, eingabe);
Anschließend setze ich die Scene und passe diese ERSTMAL an die größe der vorhandenen Felder an:
Code:
        Scene scene = new Scene(group, eingabe.getLayoutX() +eingabe.getPrefWidth() + 10, eingabe.getLayoutY()+ 50);
        primaryStage.setTitle("Spiel");
        primaryStage.setScene(scene);
        primaryStage.show();

Danach rufe ich dann eine Methode auf, die die Buttons mit zwei geschachtelten for schleifen erzeugt (und das bestehende grid removed, falls bereits eins vorhanden war):

Code:
        eingabe.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                buttonErzeugen(Integer.parseInt(spalten.getText()), Integer.parseInt(zeilen.getText()), group, eingabe.getHeight());
            }
        });

Die Frage ist nun, wie ich die Scene und die Stage an die Anzahl der Buttons - also die größe des Grids - dynamisch anpassen kann. Wäre dort ein ChangeListener ratsam? Wenn ja, setze ich den auch in die Start-Methode?

Danke und Grüße
Rene
 
An welcher Stelle müsste ich das denn Setzen? Wenn ich das nach dem Methodenaufruf für buttonErzeugen mache und dann manuell das Fenster vergrößere setzt er beim nächsten betätigen des Buttons die Größe wieder auf die ursprüngliche größe der Scene.
 
Kleines Beispiel. Würde sich mit Property-Binding natürlich weit aus schöner machen lassen. Da könnte man die Größe der Buttons im Grid an die widthProperty des root-Panes binden.
Java:
@Override
public void start(Stage primaryStage) throws Exception {
    this.primaryStage = primaryStage;

    VBox root = new VBox();
    HBox inputRow = new HBox();

    TextField inputX = new TextField();
    inputX.setPrefWidth(100);

    TextField inputY = new TextField();
    inputY.setPrefWidth(100);

    GridPane pane = new GridPane();

    Button button = new Button("Generieren");
    button.setOnAction(action -> {
        int x = Integer.valueOf(inputX.getText());
        int y = Integer.valueOf(inputY.getText());

        pane.getChildren().clear();
        for(int i = 0; i < x; i++) {
            for(int j = 0; j < y; j++) {
                Button btn = new Button(i+""+j);
                btn.setPrefWidth(root.getWidth()/y);
                pane.add(btn, i,j);
            }
        }
        primaryStage.sizeToScene();
    });

    inputRow.getChildren().addAll(inputX, inputY, button);
    root.getChildren().addAll(inputRow, pane);

    Scene scene = new Scene(root);
    primaryStage.setScene(scene);
    primaryStage.sizeToScene();
    primaryStage.show();
}
 

Zurück
Oben