JavFX: VBox.setVGrow stell sich quer

Kababär

Top Contributor
Hi,

ich bin gerade ein bisschen dabei, einige Controls zu erweitern. Dabei soll das Design natürlich auch eine Rolle spielen (und ich will auf FXML verzichten, um die GUI, das Styling (CSS), die Logik und das Model sauber voneinander zu trennen).
Dabei stoße ich auf ein Problem..
Also: ich habe ein BorderPane. Im Center der BP befindet sich eine SplitPane, auf der linken Seite ein AnchorPane, welches eine VBox enthält (die wiederum eine HBox, ListView und ein ButtonBar enthält).
Kurz: BorderPane -> SplitPane -> AnchorPane -> VBox

Mein Ziel ist, dass die ListView den vertikalen Leerraum füllt.
Versucht habe ich das mit
Code:
VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setMaxHeight(Double.MAX_VALUE);

        // SEARCH FIELD
        HBox hbox = new HBox();
        hbox.setAlignment(Pos.CENTER);
        hbox.setSpacing(5);
        hbox.setPadding(new Insets(10));
        Label label = new Label("Suche: ");
        searchField = new TextField();
        hbox.getChildren().addAll(label, searchField);

        listview = new ListView();
        listview.setMaxHeight(Double.MAX_VALUE);
        VBox.setVgrow(listview, Priority.ALWAYS);

        // ADD LISTENER FOR TEXTFIELD
        searchField.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue observable, String oldWord, String newWord) {
                presenter.search(filteredData, newWord);
            }
        });

        ButtonBar buttonBar = new ButtonBar();
        Button bAdd = new Button("Add");
        Button bChange = new Button("Change");
        Button bDelete = new Button("Delete");
        buttonBar.getButtons().addAll(bAdd, bChange, bDelete);

        bDelete.setOnAction(e -> {
            presenter.delete(listview.getSelectionModel().getSelectedItem());
        });

        vbox.getChildren().addAll(hbox, listview, buttonBar);
        leftPane.getChildren().add(vbox);

Laut meinen Vorlesungsunterlagen müsste das mit
VBox.setVgrow(listview, Priority.ALWAYS);
funktionieren, solange das Child (welches als Parameter übergeben wird; hier 'listview') auch die entsprechende, maximale, vertikale Maximalgröße besitzt.

Leider tut sich da gar nichts.. hat jemand eine Idee? Die ButtonBar und die HBox (mit dem TextField und dem Label) sollten unverändert bleiben. Es soll sich lediglich die ListView auf ihre maximale vertikale Größe ausdehnen.
 

dzim

Top Contributor
Ich bin mir ziemlich sicher, dass die Liste *innerhalb* der VBox die maximale Höhe hat, aber die VBox selbst in dem Container ("leftPane"), dem sie zugeordnet ist, nicht. Dort solltest du ansetzen.
Mir hilft es oft einen CSS-Style anzuhängen - vbox.setStyle("-fx-border-color: red;"); - dann siehst du schon mal, wohin die Box reicht. Und wenn es da stimmt, nach innen vorarbeiten (ListView)...
 

Kababär

Top Contributor
Danke, super Idee!
Daran habe ich auch gedacht, aber wusste nicht auf die schnelle wie ich dahin komme mit der Umrandung (CSS, wie auch sonst? Naja, heute mag mich Java nicht, oder umgekehrt).
Danke dir :)

PS: Ah genau! Die VBox ist dran schuld. Oder eventuell das AnchorPane (?), da dieses keine setVGrow-Methode anbietet für ihre Kinder. Aber nichtsdestotrtz habe ich eine Lösung gefunden, auch wenn diese eigentlich nicht wollte, aber es funktioniert:
Code:
vbox.prefHeightProperty().bind(leftPane.heightProperty());
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben