JavaFX

2016-07-04 13 views
7

प्रारंभिक शुरू प्वाइंटJavaFX

मैं पास 1000 Person वस्तुओं जो मैं किसी भी Person वस्तुओं के भीतर संपत्ति हुए परिवर्तनों पर ध्यान करने के लिए एक Extractor सम्मिलित करना चाहते हैं के एक मौजूदा List (इस में ObservableList (UnsupportedOperationException) के तत्व को नहीं जोड़ सकता ObservableList बाद में TableView से जुड़ा होगा)।

तो मेरी कोड होगा जैसे:

ObservableList<Person> observablePersons = FXCollections.observableList(personlist, 
    personextractor); 

त्रुटि संदेश

लेकिन जब मैं इस ObservableList को observablePersons जोड़ने के लिए एक नए व्यक्ति की वस्तुओं की कोशिश, मैं इस त्रुटि प्राप्त:

run: 
Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.add(AbstractList.java:148) 
    at com.sun.javafx.collections.ObservableListWrapper.doAdd(ObservableListWrapper.java:101) 
    at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:151) 
    at java.util.AbstractList.add(AbstractList.java:108) 
    at test.listchangelistener.listChangeDemo.main(listChangeDemo.java:72) 
Java Result: 1 

क्या आप कृपया मुझे बता सकते हैं कि मैं इस युग में क्यों आऊंगा आर संदेश? मेरे जावा संस्करण है jdk1.8.0_91 (32-बिट)

व्यक्ति कक्षा

package test.listchangelistener; 

import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 

class Person { 

    private final IntegerProperty age = new SimpleIntegerProperty(); 
    private final StringProperty name = new SimpleStringProperty(); 

    public Person(String name, Integer age) { 
     setName(name); 
     setAge(age); 
    } 

    public int getAge() { 
     return age.get(); 
    } 

    public final void setAge(int value) { 
     age.set(value); 
    } 

    public IntegerProperty ageProperty() { 
     return age; 
    } 

    public String getName() { 
     return name.get(); 
    } 

    public final void setName(String value) { 
     name.set(value); 
    } 

    public StringProperty nameProperty() { 
     return name; 
    } 

    @Override 
    public String toString() { 
     return "Person{" + "age=" + age.get() + ", name=" + name.get() + '}'; 
    } 

} 

टेस्ट कोड

package test.listchangelistener; 

import java.util.Arrays; 
import java.util.List; 
import javafx.beans.Observable; 
import javafx.collections.FXCollections; 
import javafx.collections.ListChangeListener; 
import javafx.collections.ObservableList; 
import javafx.util.Callback; 


public class listChangeDemo { 
    public static void main(String[] args) { 

     Person p1 = new Person("Ted", 26); 
     Person p2 = new Person("Anne", 19); 

     // just a simple list 
     List<Person> persons = Arrays.asList(p1, p2); 

     // extractor to observe change of person properties 
     Callback<Person, Observable[]> extractor = (Person p) -> { 
      return new Observable[]{ 
       p.ageProperty(), 
       p.nameProperty() 
      }; 
     }; 

     // make list observable and attach extractor 
     ObservableList<Person> observablePersons = FXCollections.observableList(persons, extractor); 

     // create listchangeListener for observableList 
     ListChangeListener listener = (ListChangeListener) (ListChangeListener.Change c) -> { 
      while (c.next()) { 
       if (c.wasAdded()) { 
        System.out.println("these were added: "); 

        List addedSubList = c.getAddedSubList(); 
        addedSubList.forEach((Object t) -> { 
         System.out.println("added Person: " + t); 
        }); 
       } else if (c.wasRemoved()) { 
        System.out.println("these were removed"); 

        List removedSubList = c.getRemoved(); 
        removedSubList.forEach((Object t) -> { 
         System.out.println("removed Person: " + t); 
        }); 

       } else if (c.wasUpdated()) { 
        System.out.println("these were updated"); 

        System.out.println("Updated elements are: " 
          + c.getList().subList(c.getFrom(), c.getTo())); 
       } 
      } 
     }; 

     // attach listchangeListener to observableList 
     observablePersons.addListener(listener); 

     // testing changes 
     observablePersons.add(new Person("Siegfried", 10)); 

    } 
} 
+0

मुझे नहीं लगता कि इस सवाल का डुप्लिकेट के रूप में चिह्नित किया जाना चाहिए। जबकि अंतर्निहित समस्या एक जैसी होती है, हालात अलग-अलग होते हैं। मेरी राय में, इस मामले में देखने योग्य सूची के अतिरिक्त यह एक अद्वितीय सवाल बनाता है –

उत्तर

11

समस्या के निर्माण से आ रही है आपके बैकिंग List:

List<Person> persons = Arrays.asList(p1, p2); 

आप javadoc of Arrays.asList पर एक बार देख ले, तो:

Throws: UnsupportedOperationException - if the add operation is not supported by this list.

आप के निर्माण को अद्यतन कर सकते हैं: करीब से देख आप एक UnsupportedOperationException क्योंकि List.add() मिला पर

Returns a fixed-size list backed by the specified array.

एक वैकल्पिक आपरेशन है बैकिंग सूची के रूप में:

List<Person> persons = new ArrayList<Person>(Arrays.asList(p1, p2)); 

अंतर यह है कि लौटा ArrayList पारित की एक सटीक, स्वतंत्र प्रति है, इसलिए ऊपर वर्णित प्रतिबंध अब इस मामले में मान्य नहीं है।

तुम भी इस सवाल का जो गहराई में इस विषय explaines पर एक नज़र ले जा सकते हैं:

Difference between Arrays.asList(array) vs new ArrayList<Integer>(Arrays.asList(ia)) in java

+0

हाय DVarga! आपके तेज़ उत्तर के लिए बहुत बहुत धन्यवाद! हां, मैंने Arrays.asList() के प्रतिबंध को पूरी तरह से अनदेखा कर दिया। वह मेरे बारे में इतना बेवकूफ था। वैसे भी एक टन धन्यवाद! – Chiggiddi

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