एक ऑब्जर्वेबल लिस्ट ओबलिस्ट में एक श्रोता होता है, इसके अलावा यह ट्री व्यू को अपडेट करता है। जैसे ही नई स्ट्रिंग "संगीत" को ओबलिस्ट में जोड़ा जाता है, नया आइटम बनाया जाता है और ट्री व्यू में डाल दिया जाता है। आइटम अपेक्षित "संगीत" के बजाय "{ [संगीत] 0 } पर जोड़ा गया" के रूप में प्रस्तुत करता है।

TreeItem<String> root = new TreeItem();
root.setExpanded(true);
TreeView<String> treeView = new TreeView(root);
treeView.getChildren().add(new TreeItem<String>("cat")); // normal behaviour
obList = FXCollections.observableArrayList();
obList.addListener(new ListChangeListener<String>() {
    @Override
    public void onChanged(ListChangeListener.Change<? extends String> c) {
        while (c.next()) {
            if (c.wasAdded()) {
                TreeItem<String> temp = new TreeItem(c);
                tree.getRoot().getChildren().add(temp);
            }  
        }
});

obList.add("music");

ऐसा लगता है कि चर c में स्ट्रिंग और अतिरिक्त जानकारी है। क्या हो रहा है और मुझे क्या करना चाहिए?

1
mark mark 13 जिंदा 2019, 21:06

2 जवाब

सबसे बढ़िया उत्तर

यदि आपने कच्चे प्रकार का उपयोग नहीं किया है, तो संकलक ने इस मुद्दे के बारे में शिकायत की होगी।

आप निम्न पंक्ति में String के बजाय ListChangeListener.Change ऑब्जेक्ट के लिए मान सेट करते हैं। दाहिने हाथ की ओर कच्चे प्रकार का उपयोग करने से उस प्रकार की जाँच को हटा दिया जाता है जिसके परिणामस्वरूप संकलन समय त्रुटि होती।

TreeItem<String> temp = new TreeItem(c);

इसके बजाय जोड़े गए आइटम की सूची के माध्यम से पुनरावृति करें और उन सभी के लिए एक TreeItem जोड़ें:

while (c.next()) {
    if (c.wasAdded()) {
        for (String element : c.getAddedSubList()) {
            TreeItem<String> temp = new TreeItem<>(element);
            tree.getRoot().getChildren().add(temp);
        }
    }  
}
1
fabian 13 जिंदा 2019, 21:21

ठीक है, मैंने इसे इसके साथ तय किया:

obList.getAddedSubList().forEach(l ->
    TreeItem<String> temp = new TreeItem(l);
    tree.getRoot().getChildren().add(temp);
});
0
mark mark 13 जिंदा 2019, 21:26