2012-03-22 10 views
5

मैं javafx को एक कस्टम घटक बनाने की कोशिश कर रहा हूं, इसलिए मैं अपनी कक्षा को javafx.scene.control बढ़ाता हूं। नियंत्रण और कन्स्ट्रक्टर पर यह सामग्री को खींचता है।जावाएफएक्स: मेरे कस्टम घटक को मूल लेआउट से सभी उपलब्ध स्थान का उपयोग कैसे करें?

मेरे संदेह हैं: मैं इसे अपने मूल लेआउट पर उपलब्ध सभी जगहों को भरने के लिए "बढ़ने" कैसे बना सकता हूं? जब मैं एक TextArea बजाय ... जगह की तरह

यह एक क्या मैं का उदाहरण हटना है:

@Override 
public void start(Stage primarystage) throws Exception { 
    BorderPane bpane = new BorderPane(); 
    mainscene = new Scene(bpane, 800, 600); 
    ((BorderPane) this.mainscene.getRoot()).setCenter(t); 

    primarystage.setScene(mainscene); 
    primarystage.show(); 
} 

इस उदाहरण TextArea सभी जगह लेआउट इसके लिए प्रदान करते हैं मिल जाएगा। मैं चाहता हूं कि मेरा घटक वही करे!

सभी मैंने पहले से ही करने की कोशिश की है: - गुण सेट करें मैक्सविड्थ/ऊंचाई, setPrefWidth/ऊंचाई, setMinWidth/ऊंचाई; (जब मैं MinValues ​​सेट करता हूं, तो यह हमेशा इस मान का उपयोग आकर्षित करने के लिए करता है लेकिन अब "चौड़ाई" मान को अपडेट नहीं करता है) - बड़े आकार को मजबूर करने के लिए Double.MAX_VALUE का उपयोग करने का प्रयास किया गया तो लेआउट निजीकृत; सब कुछ फ्लॉप काम :(मैं किसी भी तरह भूल जाना चाहिए ... - मैं एक छोटे से भी रोया, लेकिन फिर भी यह कुछ भी नहीं काम करने के = '(

हो सकता है कि एक सुराग है, मैं एक श्रोता इस तरह नीचे डाल दिया, और हर मैं अपने आवेदन/चरण यह TextArea अद्यतन करता है आकार बदल दें। लेकिन जब मैं इस श्रोता मेरी घटक करना जोड़ने यह कभी नहीं अद्यतन मिलता है ...

TextArea t = new TextArea("teste"); 
t.widthProperty().addListener(new ChangeListener() { 
    public void changed(ObservableValue observable, Object oldValue, Object newValue) { 
    System.out.println(oldValue + "|" + newValue); 
    } 
}); 

शायद मैं कुछ गुण या कुछ भूल, मैं डॉन द्वारा गुजर पता नहीं ...

मैंने पहले ही Google की कोशिश की है, लेकिन ऐसा लगता है कि जावाएफएक्स का दस्तावेज बहुत छोटा और सुपरफीसी है अल, और उनमें से एक बहुत JavaFX स्क्रिप्ट पर आधारित है ...

मैं भी किसी भी ट्यूटोरियल उन्हें ओरेकल द्वारा की पेशकश की एक ...

किसी भी मदद की अग्रिम धन्यवाद ... मैं बात बेहतर स्वीकार करता रहा ज्यादा करने के लिए लिखा था ... = हे

उत्तर

16

मैंने पाया कि मैं क्या भूल गया था ...

बनाने के एक घटक है यह माता पिता के साथ बड़े होते हैं, तुम सब करने की जरूरत है maxwidth पर परिभाषित करने और/या यह maxHeight है डबल (अधिकतम की तरह) का अधिकतम मान, और इसके डिफ़ॉल्ट मानों के साथ minwidth/ऊंचाई और prefwidth/ऊंचाई दें।

this.setMaxWidth(Double.MAX_VALUE); 
this.setMaxHeight(Double.MAX_VALUE); 
इस विन्यास जब जनक उपलब्ध स्थान यह अंतिम विधि setWidth का उपयोग करेगा()/setHeight() में परिवर्तन चौड़ाई/ऊंचाई अपने घटक उपयोग कर सकते हैं अद्यतन करने के लिए के साथ

। इसलिए, चूंकि ये विधियां अंतिम हैं, इसलिए जब कोई परिवर्तन होता है तो आप उसे "पता" करने के लिए ओवरराइड नहीं कर सकते हैं। जब आपको अपने घटक को पुन: पेश करने की आवश्यकता होती है तो आपको अधिसूचित होने के लिए नीचे एक चेंजलिस्टर जोड़ना होगा।

t.widthProperty().addListener(new ChangeListener() { 
     public void changed(ObservableValue observable, Object oldValue, Object newValue) { 
     System.out.println(oldValue + "|" + newValue); 
     } 
    }); 

आशा है कि यह कई अन्य लोगों में मदद करता है ...

3

मैं (जावा 8 के लिए) में पाया गया - कि कस्टम नियंत्रण केवल एक माता पिता के नोड के अंदर ठीक से आकार बदलने के लिए जब वे GridPane, HBox, VBox के हैं या, अधिमानतः, StackPane करने के लिए। ओरेकल कस्टमकंट्रोल उदाहरण VBox का उपयोग करता है। मैं अपने कस्टम नियंत्रण के शीर्ष नोड के रूप में एंकरपैन के साथ काम करने के लिए आकार बदलने का आकार नहीं ले सकता था, न कि जब अधिकतम रूप से अधिकतम WIDTH & maxHeight

तो संशोधित कस्टमकंट्रोल।fxml इस तरह है:

?xml version="1.0" encoding="UTF-8"?> 
<!-- Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. --> 

<?import java.lang.*?> 
<?import javafx.collections.*?> 
<?import javafx.geometry.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<fx:root type="javafx.scene.layout.StackPane" xmlns:fx="http://javafx.com/fxml"> 

    (and here inside the StackPane one can place the actual control, e.g. the 
    Anchor Pane with child nodes from ScreenBuilder - 
    works without maxWidth or maxHeight) 

</fx:root> 

और CustomControl.java StackPane (VBox के बजाय)

AnchorPane साथ
+1

एंकर का उपयोग करने की जरूरत है प्रदान करता है (उदाहरण के लिए: 'AnchorPane.setBottomAnchor (yourNode, इनसेट)')। कस्टम घटक के मामले में – assylias

+0

स्टैकपेन मेरे लिए काम करता है। बहुत बहुत धन्यवाद। – ruX

संबंधित मुद्दे