2014-11-10 26 views
9

Tôi thực sự gặp khó khăn để hiểu cách đối tượng ObservableList hoạt động trong JavaFX. Tôi muốn theo dõi nếu một đối tượng trong danh sách đã được sửa đổi. Cho đến nay, tôi chỉ thấy rằng tôi có thể theo dõi xem danh sách, với tư cách là một thực thể, đã được sửa đổi ... nhưng không phải là các đối tượng trong danh sách:Làm thế nào để theo dõi các thay đổi trên các đối tượng có trong một ObservableList JavaFX

private ObservableList<Stuff> myList = FXCollections.<Stuff>observableArrayList(); 

    myList.addListener((ListChangeListener.Change<? extends Stuff> change) -> { 
     while(change.next()){ 
      if(change.wasUpdated()){ 
       System.out.println("Update detected"); 
      } 
      else if(change.wasPermutated()){ 

      } 
      else{ 
       for (Stuff remitem : change.getRemoved()) { 
        //do things 
       } 
       for (Stuff additem : change.getAddedSubList()) { 
        //do things 
       } 

      } 
     } 
    }); 

là có cách để thực hiện việc này. Tôi đang tìm một luồng công việc của sự kiện như sửa đổi đối tượng triggers => modify trên danh sách triggers => refresh trên một view có danh sách như là nguồn chính của nó.

Cảm ơn

+2

bản sao có thể có của [Java 8: Danh sách có thể quan sát - Trình nghe không hợp lệ và Trình nghe thay đổi được gọi trong trường hợp thay đổi thuộc tính] (http://stackoverflow.com/questions/26730034/java-8-observable-list-invalidation-listener -nor-change-listener-được gọi là trong) –

+2

Xem thêm bài đăng trên blog này: [Thuộc tính Extractor: Cách tốt nhất để có được ListView ngay lập tức cập nhật các phần tử của nó] (http://www.jensd.de/wordpress/?p = 1650) –

Trả lời

3

Nếu bạn muốn theo dõi những thay đổi của các đối tượng bên trong danh sách thay vì danh sách riêng của mình, sau đó bạn phải chú nghe đến các đối tượng trong danh sách và không vào danh sách.

Tất nhiên để có thể thực hiện việc này, các đối tượng phải hỗ trợ điều này. java.lang.Object không hỗ trợ điều này.

Thay vào đó hãy xem giao diện ObservableValue. Các đối tượng thực hiện giao diện này hỗ trợ kiểu giám sát này mà bạn đang tìm kiếm. Trang javadoc của ObservableValue liệt kê tất cả các lớp được xây dựng trong JavaFX triển khai giao diện này (danh sách khá looooong).

Hoặc bạn phải sử dụng bất kỳ thứ gì trong số đó hoặc bạn phải tự triển khai giao diện. Và thêm người nghe thay đổi của bạn vào các đối tượng chứ không phải vào danh sách.

+5

Đã có API để thực hiện việc này: xem http://stackoverflow.com/questions/26730034/java-8-observable-list-invalidation-listener-nor-change-listener-is-called-in/26734379 # 26734379 –

3
public static void main(String[] args) { 
    ArrayList<Integer> intList = new ArrayList(); 
    intList.add(0); 
    intList.add(1); 

    ObservableList<Integer> ob = FXCollections.observableArrayList(intList); 
    ob.addListener(new ListChangeListener<Integer>() { 
     @Override 
     public void onChanged(javafx.collections.ListChangeListener.Change<? extends Integer> c) { 
      System.out.println("Changed on " + c); 
      if(c.next()){ 
       System.out.println(c.getFrom()); 
      } 

     } 

    }); 

    ob.set(0, 1); 
} 

Sự kiện (c trong trường hợp của tôi) là chỉ mục thay đổi xảy ra (khi bạn làm .getFrom()). Ngoài ra nếu bạn in sự kiện ra bạn nhận được một chuỗi cho bạn biết chính xác những gì happend. Bạn nhầm lẫn giải thích nó có một sự thay đổi đang được thực hiện trên danh sách như một toàn thể!

Các vấn đề liên quan