2013-04-18 15 views
6

Stworzyłem ten dialog JavaFX z przycisku Zamknij:przycisk wyrównania w JavaFX

final int xSize = 300; 
final int ySize = 280; 
final Color backgroundColor = Color.WHITE; 
final String text = "SQL Browser Version 1.0"; 

final Stage aboutDialog = new Stage(); 
aboutDialog.initModality(Modality.WINDOW_MODAL); 

Button closeButton = new Button("Close"); 
closeButton.setAlignment(Pos.BOTTOM_CENTER); 

closeButton.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(ActionEvent arg0) { 
     aboutDialog.close(); 
    } 
}); 

Scene aboutDialogScene = new Scene(VBoxBuilder.create() 
    .children(new Text(text), closeButton) 
    .alignment(Pos.CENTER) 
    .padding(new Insets(10)) 
    .build(), xSize, ySize, backgroundColor); 

aboutDialog.setScene(aboutDialogScene); 
aboutDialog.show(); 

chcę, aby wyświetlić przycisk na dole okna dialogowego. Użyłem tego do ustawienia wyrównania: closeButton.setAlignment(Pos.BOTTOM_CENTER);, ale z jakiegoś powodu przycisk jest wyświetlany w środku okna dialogowego. Czy możesz mi powiedzieć, jak mogę to naprawić?

Odpowiedz

17

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ż):

  1. Użyj StackPane zamiast VBox i wyrównać przycisk z StackPane.setAlignment(closeButton, Pos.BOTTOM_CENTER);
  2. użyć AnchorPane zamiast a VBox i odpowiednio ustawić ograniczenia na AnchorPane.
  3. 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> 

snapshot of fxml

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>