2015-04-26 11 views
8

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

यह बुरा है। मैं प्रत्येक सेल को सूची दृश्य में बिल्कुल फिट करना चाहता हूं, और स्क्रॉलबार से छुटकारा पाता हूं। ज़्यादा सही। जब ListView को इसकी न्यूनतम चौड़ाई तक कम कर दिया जाता है, तो इसकी सभी कोशिकाओं को भी कम से कम चौड़ाई तक कम किया जाना चाहिए।

मैं कुछ नियंत्रण संपत्ति की तलाश कर रहा हूं जो किसी पूर्व निर्धारित स्विच के मामले में वर्णित व्यवहार प्राप्त करने के लिए कुछ हैक के सेल आकार बदलने नीति को स्विच करता है।


अद्यतन: जोड़ा ग्राफिक उदाहरण

मैं SplitPane परीक्षण लेआउट आसान बनाने के लिए बनाया गया है। मैं अपने विभाजक को माउस से ले जाकर लेआउट प्रतिबंधों को परिभाषित कर सकता हूं।

पहला शॉट प्रारंभिक समस्या दिखाता है: सेल नोड्स के वास्तविक आयाम (न्यूनतम, अधिकतम, pref) का सम्मान नहीं किया जाता है। ListView हमेशा prefWidth का उपयोग करता है भले ही यह व्यूपोर्ट चौड़ाई से अधिक हो। इसलिए क्षैतिज स्क्रॉल का उपयोग तब किया जाता है जब इसे टाला जा सके।

bad

उसके बाद मैं मैन्युअल रूप से पसंद की चौड़ाई कम पर सेट करने की कोशिश की। तो सेल अब पूरी तरह से दिखाई दे रहा है। यह समाधान नहीं है। मैं इस शॉट को साबित करने के लिए देता हूं कि सेलव्यू में सूची दृश्य के अंदर फिट होने के लिए पर्याप्त रूप से छोटा मिनीविड्थ है।

ugly

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

समस्या को स्पष्ट रूप से निर्दिष्ट तत्वों के स्थिर आकार में स्विच करके दबाया जा सकता है। लेकिन ऐसा करने का मतलब गतिशील लेआउट के सभी लाभों को त्यागना है: प्रोग्रामर को प्रत्येक बार नई त्वचा को सीएसएस के साथ लागू करने के लिए आकार स्थिरांक बदलने के लिए बाध्य किया जाएगा और उपयोगकर्ता को खिड़की का आकार बदलने या माउस के साथ विभाजक को स्थानांतरित करने के लिए निषिद्ध किया जाएगा।

और यह भी खराब समाधान है। मुझे जवाफक्स काम के लेआउट इंजन बनाने के लिए क्या चाहिए। ListView की न्यूनतम चौड़ाई इसकी कोशिकाओं की सबसे बड़ी न्यूनतम चौड़ाई होनी चाहिए। ListView की अधिकतम चौड़ाई अपनी कोशिकाओं की न्यूनतम अधिकतम चौड़ाई होना चाहिए। ListView की पसंदीदा चौड़ाई को इसकी कोशिकाओं की सबसे बड़ी चौड़ाई चाहिए। और ListView की वास्तविक चौड़ाई की तुलना में सभी तीन लेआउट सीमाओं के सम्मान के साथ अपने माता-पिता (स्प्लिटपेन इस उदाहरण में) द्वारा निर्धारित की जानी चाहिए। और उसके बाद यह आकार कोशिकाओं को पारित किया जाना चाहिए।

क्षैतिज स्क्रॉलबार केवल तभी दिखाना चाहिए जब कुछ सेल न्यूनतम चौड़ाई व्यूपोर्ट में फ़िट होने के लिए बहुत बड़ी हो।

+1

क्या आप कृपया पहले से प्रयास किए गए कोड के लिए कोड जोड़ सकते हैं। यदि संभव हो तो एक छवि भी। – ItachiUchiha

+0

मैंने वास्तव में स्कैला में लिखा था। क्या यह जावा कोड में स्कैला कोड पोस्ट करने के लिए उपयुक्त है? – ayvango

+0

"स्कैला" टैग जोड़ने के बाद हाँ। कोई इसे जावा में परिवर्तित कर सकता है हालांकि वहां कई अलग-अलग व्यवहार हो सकते हैं। –

उत्तर

2

बस सूची दृश्य widthProperty पर सेल के prefWidthProperty को बांधें। मैं सीमाओं और इस तरह के लिए थोड़ा सा घटाना।

तारों के साथ, आपको स्क्रॉल बार के बजाय इलिप्सिस मिल जाएगा ...।

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.ListView; 
import javafx.scene.control.SplitPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class CellSize extends Application { 

    @Override 
    public void start(Stage stage) { 
     ObservableList<String> items = FXCollections.observableArrayList(
       "hello world", "This is a test", "this is not a drill","vroom...this IS a drill"); 

     ListView<String> lv = new ListView(items); 
     final VBox leftBox = new VBox(lv,new Button("Unused")); 

     lv.setCellFactory(new Callback<ListView<String>, ListCell<String>>() { 

      @Override 
      public ListCell<String> call(ListView<String> param) { 
       ListCell lc = new ListCell<String>() { 

        @Override 
        protected void updateItem(String item, boolean empty) { 
         super.updateItem(item, empty); 
         if (empty) { 
          setText(null); 
          setGraphic(null); 
         } else { 
          setGraphic(null); 
          if (item == null) setText("null"); 
          else { 
           setText(item); 
           double minWidth = 5 * item.length(); 
           double maxWidth = 10 * item.length(); 
           leftBox.setMinWidth(Math.max(minWidth, leftBox.getMinWidth())); 
           leftBox.setMaxWidth(maxWidth); 
          } 
         } 
        } 
       }; 
       lc.prefWidthProperty().bind(lv.widthProperty().subtract(4)); 
       return lc; 
      } 
     }); 

     SplitPane root = new SplitPane(); 
     root.getItems().addAll(leftBox,new VBox(new Label("Hello"))); 
     Scene scene = new Scene(root, 300, 250); 

     stage.setScene(scene); 
     stage.show(); 

    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 
+0

वह अनिवार्य रूप से पसंदीदा चौड़ाई बढ़ाएगा। पसंदीदा चौड़ाई माता-पिता (उदाहरण के लिए स्प्लिटपेन) द्वारा बच्चों के बीच स्क्रीन स्पेस वितरित करने के लिए उपयोग की जा सकती है – ayvango

+0

मैं 'सूची दृश्य' के समान आकार के लिए सेल का 'prefWidth' सेट कर रहा हूं, जो अंतरिक्ष को बर्बाद नहीं करता है लेकिन इसे बनाता है सही आकार इसलिए कोई स्क्रॉल बार नहीं है और कोई खाली जगह नहीं है। मैंने देखा कि आपने प्रश्न अपडेट किया है, मैं एक न्यूनतम, अधिकतम और 'स्प्लिटपेन' जोड़ने के लिए उदाहरण संपादित करूंगा – brian

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