[Java] कस्टम सेलफ़ाइनर के साथ सूची दृश्य अदृश्य नोड्स trims


Answers

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

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

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

एक 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 का उपयोग करना चाह सकते हैं (V 'के लिए ऊर्ध्वाधर', 'क्षैतिज' के लिए एच)

Question

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

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

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

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

पुन: उत्पन्न कैसे करें

मेरे StarShape , StarRow और कुछ अन्य भिन्न वर्गों को साझा करने के बजाय (मुझे अनुरोध है कि मैं खुश 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);
            }
        }
    };
}

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

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

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

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