2012-05-07 12 views
5

मैं जावाएफएक्स 2 में नया हूं और कॉम्बोबॉक्स और लिस्ट व्यू की डिफ़ॉल्ट चौड़ाई के बारे में उलझन में हूं। मैं कॉम्बोबॉक्स को व्यापक होने की अपेक्षा करता हूं, ताकि सूची "त्वरित पाठ" पूरी तरह से दिखाई दे, क्योंकि सूची दृश्य के लिए मैं अपेक्षा करता हूं कि यह छोटा हो, केवल उतना ही चौड़ा हो। नीचे दिए गए कोड और स्क्रीनशॉट।JavaFX 2 में अजीब नियंत्रण चौड़ाई?

1) मैं कैसे प्राप्त कर सकता हूं कि कॉम्बोबॉक्स और लिस्टव्यू दोनों की चौड़ाई के आकार के आकार में हैं?

2) दोनों को समान चौड़ाई (इसलिए दोनों चौड़ाई से अधिकतम) को कैसे नियंत्रित किया जाए, क्या दोनों की चौड़ाई के बीच किसी प्रकार का लिंक बनाना संभव है? मैं विशेष रूप से एफएक्सएमएल के लिए एक सुरुचिपूर्ण समाधान की तलाश में हूं।

किसी भी संकेत के लिए धन्यवाद!

@Override 
public void start(Stage primaryStage) { 
    ComboBox<String> comboBox = new ComboBox<String>(); 
    comboBox.setPromptText("the prompt text"); 
    ObservableList<String> items = FXCollections.observableArrayList(); 
    items.addAll("item 1", "item 2"); 
    comboBox.setItems(items); 

    ListView<String> list = new ListView<String>(); 
    ObservableList<String> items2 =FXCollections.observableArrayList (
     "blue", "red"); 
    list.setItems(items2); 

    VBox vBox = new VBox(); 
    vBox.getChildren().addAll(comboBox, list); 

    primaryStage.setScene(new Scene(vBox, 200, 300)); 
    primaryStage.show(); 
} 

enter image description here

उत्तर

0

1) minWidth(x), prefWidth(x), maxWidth(x) स्थापित करने के लिए प्रयास करें। इससे मदद मिलती है, लेकिन यह सुनिश्चित नहीं है कि यह एक अच्छा निर्णय है।

2) बाध्यकारी ढांचे से विधि void bind(ObservableValue<? extends Number> observable); का उपयोग करें। यह सिर्फ ऐसे मामलों के लिए विकसित किया गया था। पूर्व:

someProperty.bind(otherProperty); 

इसके अलावा आप उन्हें जोड़ने के लिए बिडरेक्शनल बाइंडिंग का उपयोग कर सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद, मैक्सविड्थ पुरानी स्थिति की तुलना में आसान/बेहतर हो गया है, हालांकि अभी भी मूल्यों का अनुमान लगाना है): मुझे JavaFX द्वारा किए गए कुछ स्वचालित समायोजन की आवश्यकता होगी): और संपत्ति की जानकारी के लिए धन्यवाद! वास्तव में WPF की तरह ;-) –

+0

और ऐसे मामलों के लिए और फिर अपने प्रोजेक्ट में fxml निर्यात करने के लिए सीनबिल्डर का उपयोग करने के लिए बेहतर है। – 4lex1v

8

2) दोनों को समान चौड़ाई (इसलिए दोनों चौड़ाई से अधिकतम) को कैसे नियंत्रित किया जाए, क्या दोनों की चौड़ाई के बीच किसी प्रकार का लिंक बनाना संभव है? मैं विशेष रूप से एफएक्सएमएल के लिए एक सुरुचिपूर्ण समाधान की तलाश में हूं।

ऐसा लगता है कि डिफ़ॉल्ट रूप से, सूची दृश्य में यह अधिकतम विजिद्ध है, लेकिन कॉम्बोबॉक्स में इसकी प्रारंभिक आइटम सूची की चौड़ाई के लिए अधिकतम अधिकतम चौड़ाई है। इन नियंत्रणों को एक ही चौड़ाई बनाने के लिए, इसे करने का सबसे आसान तरीका उन्हें लेआउट मैनेजर (जैसा आपने किया है - VBox) में रखा है और फिर कॉम्बोबॉक्स के maxWidth को अनलॉक करें।

कोड में आप यह कर सकते हैं:

comboBox.setMaxWidth(Double.MAX_VALUE); 

FXML में अपने ComboBox तत्व को attibute परिभाषा निम्नलिखित जोड़ें:

maxWidth="Infinity" 

आप जॉन ग्रे की बाइंडिंग समाधान का उपयोग कर सकते हैं, लेकिन मुझे लगता है अधिक सुरुचिपूर्ण से ऊपर।

1) मैं कैसे प्राप्त कर सकता हूं कि कॉम्बोबॉक्स और लिस्टव्यू दोनों की चौड़ाई के आकार के आकार में हैं?

मुझे लगता है कि आप यहां क्या पूछ रहे हैं कि combobox और listview को केवल उतनी ही जगह लेनी चाहिए जितनी उन्हें चाहिए और अब नहीं। यह है, मैं थोड़ा मुश्किल मानता हूं, और जावाएफएक्स मंच इस के लिए बहुत अधिक समर्थन प्रदान नहीं करता है।

न्यूनतम आवश्यक सूची में सूची बॉक्स के आकार को ठीक करने के लिए यहां कुछ नमूना कोड दिया गया है।

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.scene.*; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Priority; 
import javafx.stage.Stage; 

public class GridControlWidths extends Application { 
    public static void main(String[] args) throws Exception { launch(args); } 
    @Override public void start(Stage stage) { 
    ComboBox<String> comboBox = new ComboBox<String>(FXCollections.observableArrayList("item 1", "item 2")); 
    comboBox.setPromptText("the prompt text"); 

    ListView<String> list = new ListView<String>(FXCollections.observableArrayList ("blue", "red")); 

    // layout the controls in a grid with appropriate constraints. 
    GridPane grid = new GridPane(); 
    grid.add(comboBox, 0, 0); 
    grid.add(list, 0, 1); 
    grid.setVgrow(list, Priority.ALWAYS); // make the list grow vertically as much as possible 

    // unclamp the max width of the combo box. 
    comboBox.setMaxWidth(Double.MAX_VALUE); 

    // display the scene. 
    stage.setScene(new Scene(grid, 200, 300)); 
    stage.show(); 

    // set the prefWidth of the listview based on the list cells (allowing 8 pixels for padding of the cells). 
    double maxWidth = 0; 
    for (Node n: list.lookupAll(".text")) { 
     maxWidth = Math.max(maxWidth, n.getBoundsInParent().getWidth() + 8); 
    } 
    list.setPrefWidth(maxWidth); 
    } 
} 

Fwiw, मैं एक सिफारिश की दृष्टिकोण लगता है कि आप बस कुछ ही आइटम नहीं हैं बल्कि एक ListView या कोई ComboBox एक ChoiceBox के बजाय का उपयोग करने से एक VBox में अपने आइटम डाल करने के लिए करने के लिए है जब, इस तरह आप की जरूरत नहीं है सेल आत्मनिरीक्षण करने के लिए और पसंदीदा चौड़ाई को हर समय अद्यतन करें क्योंकि लेआउट प्रबंधक और नियंत्रण आपके लिए इसका ख्याल रखेंगे। ListView को वर्चुअलाइज्ड सूची के मामले को संभालने के लिए अनुकूलित किया गया है जिसमें हजारों मनमाने ढंग से आकार वाले आइटम हो सकते हैं जिसके लिए आप आसानी से लेआउट चौड़ाई की गणना नहीं कर पा रहे हैं, यही कारण है कि मुझे लगता है कि यह डिफ़ॉल्ट नियंत्रण आकार देने वाले व्यवहार के साथ आता है जो नहीं करता है यह संभवतः न्यूनतम आकार के आकार में हो सकता है। आम तौर पर जब सूची सूची का उपयोग करते हैं तो आप सूची के लिए एक उचित prefWidth चुनेंगे और सूची में सेट करेंगे, ऊपर दिए गए उदाहरण के रूप में आइटम्स को आत्मनिरीक्षण करने के बजाय देखें।

इसके अतिरिक्त, आपके पास छवि है जहां कुछ प्रॉम्प्ट टेक्स्ट क्लिप किया गया है, जावाफैक्स में एक बग होने के लिए (मेरे लिए) प्रतीत होता है, जहां यह कॉम्बोबॉक्स नियंत्रण टेक्स्ट के लिए कॉम्बोबॉक्स नियंत्रण के लिए पसंदीदा चौड़ाई की सही गणना नहीं करता है कॉम्बोबॉक्स आइटम टेक्स्ट से बड़ा। चूंकि कॉम्बोबॉक्स वर्तमान में एक नया नियंत्रण है और मैंने जावाएफएक्स नियंत्रण के पहले के निर्माण में इस तरह के मुद्दों को देखा है और वे तय हो गए हैं, मैं उम्मीद करता हूं कि कॉम्बोबॉक्स के लिए पसंदीदा चौड़ाई गणना जल्द ही तय हो जाएगी।

+0

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद कि नियंत्रण इस तरह से व्यवहार क्यों करते हैं (हालांकि मुझे समझ में नहीं आ रहा है कि क्यों जावाएफएक्स मेरी राय में अनजाने में ऐसा करता है)। MAX_VALUE सेट करना एक अच्छा विचार है, हालांकि समस्या यह बनी हुई है कि किसी को vbox के लिए सही चौड़ाई का अनुमान लगाना है): [प्रदत्त कोड केवल एक छोटा एक्समपल है] –

+0

प्रश्न और पता (कुछ) चिंताओं का पूरी तरह उत्तर देने के लिए अद्यतन उत्तर। – jewelsea

+0

यह जोड़ने के लिए एक और दिलचस्प बात यह है कि SceneBuilder maxWidth = "- अनंतता" का उपयोग करता है "-" साइन – 4lex1v

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