2017-09-29 19 views
0

Je n'arrive pas à centrer un bouton dans une VBox en code Java! J'ai utilisé Scene Builder pour créer un SplitPane avec l'AnchorPane gauche ayant un bouton centré dans une VBox. Je veux recréer ceci, un bouton dans une VBox, dans le bon AnchorPane mais pas dans FXML, dans Java Code. Mais le bouton droit ne centre pas, bien que j'utilise vb.setAlignment(Pos.CENTER);:JavaFX center Bouton dans la VBox

enter image description here

Mon code FXML:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.SplitPane?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.VBox?> 

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="200.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testimageview.MainViewController"> 
    <children> 
     <SplitPane dividerPositions="0.5" prefHeight="200.0" prefWidth="400.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <items> 
      <AnchorPane fx:id="leftAnchorPane" minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
       <children> 
        <VBox alignment="CENTER" prefHeight="198.0" prefWidth="171.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
        <children> 
         <Button mnemonicParsing="false" text="FXML" /> 
        </children> 
        </VBox> 
       </children> 
      </AnchorPane> 
      <AnchorPane fx:id="rightAnchorPane" minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" /> 
     </items> 
     </SplitPane> 
    </children> 
</AnchorPane> 

Et mon code de classe Java Controller:

package testimageview; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.geometry.Pos; 
import javafx.scene.control.Button; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.VBox; 

public class MainViewController implements Initializable { 

    @FXML 
    private AnchorPane leftAnchorPane; 

    @FXML 
    private AnchorPane rightAnchorPane; 

    public MainViewController() { 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
    VBox.setVgrow(leftAnchorPane, Priority.ALWAYS); 

    VBox vb = new VBox(); 

    Button rightButton = new Button(); 
    rightButton.setText("Java"); 

    vb.setAlignment(Pos.CENTER); 
    vb.getChildren().addAll(rightButton); 

    rightAnchorPane.getChildren().add(vb); 

    } 
} 
+0

Pourquoi voudriez-vous utiliser un VBox? Pourquoi pas un FlowLayout? – matt

+0

Eh bien, cela fonctionne dans le FXML avec Scene Builder (volet gauche). Alors pourquoi pas? Ce que je veux dire: Si cela fonctionne avec FXML, ne devrait-il pas aussi fonctionner avec Java (volet de droite)? – gkane

+0

Il semble juste qu'un FlowLayout est celui que vous voulez. – matt

Répondre

0

Eh bien, vous avez ne pas définir les dimensions de la VBox donc par défaut (à l'intérieur d'un ScrollPane) elle s'adaptera à la taille de ses enfants dans votre cas une taille de bouton de 50,50 ou quelque chose comme ça, donc vous ne pouvez pas voir l'alignement. Tout ce que vous devez faire est de définir la taille de la VBox pour correspondre à la taille de la deuxième AnchorPane ou vous pouvez simplement lier leurs dimensions (largeur, hauteur) comme:

vb.prefWidthProperty().bind(rightAnchorPane.widthProperty()); 
vb.prefHeightProperty().bind(rightAnchorPane.heightProperty()); 
+0

Parfait! Merci. Je n'avais pas réalisé que le bouton était centré mais la VBox était trop petite .... – gkane