2013-04-18 11 views
6

में मैं बंद करें बटन के साथ इस JavaFX संवाद बनाया:बटन संरेखण 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(); 

मैं संवाद के नीचे बटन प्रदर्शित करना चाहते हैं। मैंने संरेखण सेट करने के लिए इसका इस्तेमाल किया: closeButton.setAlignment(Pos.BOTTOM_CENTER); लेकिन किसी कारण से बटन संवाद के केंद्र में प्रदर्शित होता है। क्या आप मुझे बता सकते हैं कि मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

17

आप इस के लिए एक VBox उपयोग करना चाहते हैं, विधि आप के लिए देख रहे हैं:

VBox.setVgrow(node, Priority.ALWAYS);


डिफ़ॉल्ट रूप से एक VBox सिर्फ बच्चों के एक अन्य के तहत शीर्ष बाएं से स्थापित करेंगे आप इसे कहां रखते हैं। बच्चे सभी उपलब्ध ऊर्ध्वाधर क्षेत्र को भरने के लिए विस्तार नहीं करते हैं, जब तक कि आप बिना किसी अधिकतम ऊंचाई वाले बच्चे पर एक Vgrow बाधा सेट करते हैं।

कुछ अलग अलग तरीकों से आप लेआउट आप की तलाश प्राप्त कर सकते हैं (वहाँ दूसरों के रूप में अच्छी तरह से कर रहे हैं):

  1. एक StackPane का प्रयोग करें एक VBox के बजाय और साथ StackPane.setAlignment(closeButton, Pos.BOTTOM_CENTER);
  2. उपयोग एक AnchorPane बजाय अपने बटन संरेखित VBox और AnchorPane पर उचित बाधाएं सेट करें।
  3. spring 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); 

कॉलिंग closeButton.setAlignment(Pos.BOTTOM_CENTER); closeButton, नहीं closeButton के संरेखण के भीतर उसे अपने जनक है भीतर चीजों के संरेखण (पाठ और ग्राफिक) (सेट जो क्या आप वास्तव में चाहते हैं)।


कैसे समझ लेआउट की कमी से काम के लिए, SceneBuilder के साथ चारों ओर खेलने के लिए और ScenicView मौजूदा कोड में डिबग लेआउट मुद्दों मदद कर सकते हैं एक अच्छा उपकरण है।


यहाँ अपने लेआउट के कुछ ही FXML नमूने है कि आप कैसे अलग लेआउट विकल्प काम को देखने के लिए SceneBuilder में लोड कर सकते हैं।

नीचे नमूनों की

सभी आसानी से सादे जावा अगर आप पसंद करते JavaFX एपीआई का उपयोग कर में लिखा जा सकता है। मैं उन्हें fxml में लिखा है के रूप में यह लेआउट SceneBuilder में पूर्वावलोकन करने के लिए आसान बनाता है।

FXML नमूना एक 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

और एक ही बात कुछ वसंत क्षेत्रों के साथ:

<?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> 

और लेबल खुद का विस्तार करने के लिए सेट के साथ एक ही बात 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>