Jeśli chcesz użyć VBox
do tego, metoda szukasz jest:
VBox.setVgrow(node, Priority.ALWAYS);
domyślnie VBox będzie po prostu umieścić dzieciom jeden pod drugim od lewej górnej z miejsca, w którym ją umieścisz. Elementy potomne nie rozwijają się, aby wypełnić cały dostępny obszar pionowy, chyba że ustawiono ograniczenie Vgrow dla dziecka o nieograniczonej maksymalnej wysokości.
kilka różnych sposobów można uzyskać układ szukacie (istnieją inni również):
- Użyj
StackPane
zamiast VBox
i wyrównać przycisk z StackPane.setAlignment(closeButton, Pos.BOTTOM_CENTER);
- użyć
AnchorPane
zamiast a VBox
i odpowiednio ustawić ograniczenia na AnchorPane
.
- Użyj spring region, który jest pustym obszarem rozwiniętym w celu wypełnienia pustego miejsca.
Próbka wiosna region:
Region topSpring = new Region();
Region bottomSpring = new Region();
Scene aboutDialogScene = new Scene(VBoxBuilder.create()
.children(topSpring, new Text(text), bottomSpring, closeButton)
.alignment(Pos.CENTER)
.padding(new Insets(10))
.build(), xSize, ySize, backgroundColor);
VBox.setVgrow(topSpring, Priority.ALWAYS);
VBox.setVgrow(bottomSpring, Priority.ALWAYS);
Wywołanie closeButton.setAlignment(Pos.BOTTOM_CENTER);
ustawia wyrównanie rzeczy (tekstowych i graficznych) w obrębie CloseButton, a nie z dostosowaniem CloseButton ciągu jest to dominująca (co jest to, czego naprawdę chcesz).
Dla zrozumienia jak działa układ ograniczenia, SceneBuilder jest dobrym narzędziem do bawić się i ScenicView może pomóc w kwestii układu debugowania istniejącego kodu.
Oto kilka przykładowych efektów FXML, które można załadować do SceneBuilder, aby zobaczyć, jak działają różne opcje układu.
Wszystkie poniższe próbki można z łatwością napisać w zwykłym języku Java za pomocą interfejsu API JavaFX, jeśli wolisz. Napisałem je w formacie fxml, dzięki czemu układy są łatwe do podglądu w SceneBuilder.
FXML próbki za pomocą StackPane:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<StackPane id="StackPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
<children>
<Label text="SQL Browser Version 1.0" />
<Button mnemonicParsing="false" text="Button" StackPane.alignment="BOTTOM_CENTER" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</StackPane>
i to samo z niektórych regionów wiosny:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<VBox alignment="CENTER" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
<children>
<Region prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" />
<Label text="SQL Browser Version 1.0" />
<Region prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" />
<Button mnemonicParsing="false" text="Close" />
</children>
</VBox>
i to samo z etykietą sama się rozszerzyć, wypełnić pustą przestrzeń w vBox:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<VBox alignment="CENTER" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
<children>
<Label maxHeight="1.7976931348623157E308" text="SQL Browser Version 1.0" VBox.vgrow="ALWAYS" />
<Button mnemonicParsing="false" text="Close" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</VBox>