[java] कस्टम सेलफैक्टरी trims अदृश्य नोड्स के साथ ListView



Answers

मुझे लगता है कि मैं इस गलत तरीके से आ रहा हूं

नहीं आप नहीं हैं। सभी लेआउट के साथ, एक ही समस्या से संपर्क करने के लिए अक्सर कई तरीके होते हैं। आपका दृष्टिकोण वास्तव में सही है, और आप एक कामकाजी समाधान के बहुत करीब हैं।

आप केवल 1 लाइन परिवर्तन के साथ जो हासिल कर रहे हैं उसे प्राप्त कर सकते हैं। यही है, Group को HBox बदल रहा है।

एक HBox यह सुनिश्चित करता है कि तत्वों को क्षैतिज रूप से आदेश दिया जाता है, एक दूसरे के बाद। वे अदृश्य तत्वों को अभी भी स्थान लेने की अनुमति देते हैं।

मैंने एक पंक्ति भी टिप्पणी की: label.setLayoutX(40) । मैंने ऐसा इसलिए किया क्योंकि HBox इस सेटिंग का सम्मान नहीं करेगा, और वास्तव में आपको इसकी आवश्यकता नहीं है। यह स्वचालित रूप से आवश्यकतानुसार क्षैतिज तत्वों को स्थानांतरित कर देगा।

@Override
protected void updateItem(Boolean item, boolean empty) {
    super.updateItem(item, empty);

    if (empty || item == null) {
        setText(null);
    }
    else {
        final Rectangle tabShape = new Rectangle();
        tabShape.setHeight(20);
        tabShape.setWidth(40);
        tabShape.setVisible(item);

        final Label label = new Label(item.toString());
        //label.setLayoutX(40);

        final HBox cellRoot = new HBox();
        cellRoot.getChildren().add(tabShape);
        cellRoot.getChildren().add(label);

        setGraphic(cellRoot);
    }
}

जब मैं उन परिवर्तनों को करता हूं, तो आपका लेआउट इस तरह प्रस्तुत करेगा:

महत्वपूर्ण : आपका उदाहरण और आपके स्क्रीनशॉट थोड़ा अलग हैं। आप अपने स्टार उदाहरण के लिए VBox का उपयोग करना चाह सकते हैं ('वर्टिकल' के लिए वी, एच 'क्षैतिज' के लिए एच)।

Question

मेरा लेआउट मुद्दा

मेरे पास ListView साथ एक छोटी सी समस्या है और मुझे यकीन नहीं है कि यह कुछ ज्ञान के कारण है या मुझे लगता है कि मेरा दृष्टिकोण त्रुटिपूर्ण है। स्वीकार करना है कि मैं अभी तक स्पष्ट नहीं हूं कि JavaFX कई संभावित मामलों में लेआउट को कैसे संभालता है।

उपर्युक्त स्क्रीनशॉट परिणाम दिखाता है कि मुझे सटीक कोड के साथ दो बार मिलता है, सिवाय इसके कि दूसरे पर एक अदृश्य आकार मैं सुसंगत लेआउट के लिए उपयोग करता हूं , डीबग के लिए दृश्यमान होता है

CellFactory द्वारा Group शामिल विभिन्न वर्गों ने Group विस्तारित किया है, मैंने अब तक कुछ अन्य Parent - Parent साथ बहुत सफलता के बिना प्रयास किया है।

पुनरुत्पादन कैसे करें

मेरे StarShape , StarRow और कुछ अन्य विविध वर्गों को साझा करने के बजाय (अगर अनुरोध किया जाए तो मुझे खुशी होगी) मैंने इस मुद्दे को पुन: उत्पन्न करने के लिए एक नमूना लिखा था। कक्षा Application बढ़ाती है और start(...) विधि को ओवरराइड करती है जैसे:

@Override
public void start(Stage primaryStage) throws Exception {
    final StackPane root = new StackPane();
    final Scene scene = new Scene(root, 400, 600);

    final ListView<Boolean> listView = new ListView<>();
    listView.setCellFactory(this::cellFactory);

    for (int i = 0; i < 5 ; i++) {
        listView.getItems().add(true);
        listView.getItems().add(false);
    }

    root.getChildren().add(listView);

    primaryStage.setScene(scene);
    primaryStage.setTitle("ListView trims the invisible");
    primaryStage.show();
}

जहां this::cellFactory है

private ListCell<Boolean> cellFactory(ListView<Boolean> listView) {
    return new ListCell<Boolean>() {
        @Override
        protected void updateItem(Boolean item, boolean empty) {
            super.updateItem(item, empty);

            if (empty || item == null) {
                setText(null);
            } else {
                final Rectangle tabShape = new Rectangle();
                tabShape.setHeight(20);
                tabShape.setWidth(40);
                tabShape.setVisible(item);

                final Label label = new Label(item.toString());
                label.setLayoutX(40);

                final Group cellRoot = new Group();
                cellRoot.getChildren().add(tabShape);
                cellRoot.getChildren().add(label);

                setGraphic(cellRoot);
            }
        }
    };
}

उपर्युक्त true सूची के सामने काले आकार के साथ एक ListView<Boolean> प्रदर्शित करेगा ( tabShape.setVisible(item); बिट के कारण)। false चीजें नियमित Label ऑब्जेक्ट्स की तरह दिख रही हैं जैसे कि उनके Group में अदृश्य आकार वहां नहीं था (लेकिन यह है)।

टिप्पणियां बंद करना

इसे डिबग करने से, यह अदृश्य आकार वाले समूहों को नकारात्मक लेआउटएक्स गुण मान दिए जाते हैं । इस प्रकार Label नियंत्रण को गठबंधन नहीं किया गया है क्योंकि मैं उन्हें बनना चाहता हूं। ऐसा तब नहीं होता जब मैं setLayoutX और setLayoutY को ListView बाहर कॉल करता हूं (अदृश्य आकार बल ऑफसेट करता है), लेकिन शायद यह एकमात्र ऐसा स्थान नहीं है जहां यह होगा।

क्या हो रहा है और इससे कैसे बचें? वैकल्पिक रूप से, जैसा कि मैं अनुमान लगा रहा हूं कि मैं इस गलत तरीके से आ रहा हूं , सही तरीका क्या होगा? दूसरे शब्दों में, इसके बजाय मुझे क्या सवाल पूछना चाहिए?




Links