2013-07-11 25 views
5

Tôi gặp khó khăn khi hiểu dữ liệu trong ứng dụng RCP Eclipse của tôi. Tôi chỉ không thể hiểu nó như thế nào là nghĩa vụ phải làm việc ..Cách thực hành tốt nhất để gắn kết dữ liệu danh sách trong ứng dụng RCP Eclipse

Đây là những gì tôi muốn làm

Tôi có một Xem nơi một danh sách các văn bản sẽ được hiển thị. Các văn bản được "lưu trữ" trong một đơn giản List<String> được cung cấp thông qua một singleton (chỉ cho mục đích trình diễn;)). Vì vậy, bất cứ ai sử dụng ListProvider sẽ nhận được danh sách các văn bản. Khi danh sách thay đổi, tôi muốn Chế độ xem của tôi tự động cập nhật nội dung bảng.

Dưới đây là những gì tôi đã làm cho đến nay

nhà cung cấp Danh sách của tôi là một Observable đó sẽ thông báo cho các quan sát viên khi thay đổi danh sách.

Theo quan điểm của tôi, tôi tạo một người quan sát để xem nhà cung cấp danh sách và khi người quan sát được thông báo, tôi làm mới chế độ xem của mình.

Mã cho ListProvider: Mã

public class ListProvider extends Observable { 

    private Stack<String> hist; 
    private static ListProvider instance; 

    // Singleton implementation 
    public static ListProvidergetInstance() { 
     if (null == instance) { 
      instance = new ListProvider 
     } 
     return instance; 
    } 

    public void add(String text) { 
     if (this.hist.size() == MAX_SIZE) { 
      this.hist.remove(MAX_SIZE-1); 
     } 
     this.hist.add(0, text); 
     // notify all observers 
     this.setChanged(); 
     this.notifyObservers(); 
    } 
} 

cho quan điểm:

public class TestView extends ViewPart { 

private TableViewer viewer; 

[...] 

class ViewContentProvider implements IStructuredContentProvider { 
    public void inputChanged(Viewer v, Object oldInput, Object newInput) { 
    } 
    public void dispose() { 
    } 
    public Object[] getElements(Object parent) { 
     return ClipboardHistory.getInstance().getList().toArray(); 
    } 
} 

public void createPartControl(Composite parent) { 
    viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 
    IContentProvider contentProvider = new ViewContentProvider(); 
    viewer.setContentProvider(contentProvider); 
    viewer.setLabelProvider(new ViewLabelProvider()); 
    viewer.setInput(getViewSite()); 

    Observer listObserver = new Observer() { 
     @Override 
     public void update(Observable o, Object arg) { 
      // update the table viewer 
      viewer.refresh(); 
     } 
    }; 

    ListProvider.getInstance().addObserver(listObserver); 
} 
} 

Câu hỏi

Đang sử dụng ObserverObservable "quyền" con đường để đi hay tôi thiếu một cái gì đó? Tôi không chắc mình đã nắm được khái niệm về Databinding RCP ...

+0

Tôi không chắc chắn về phạm vi của các mục trong danh sách của bạn nhưng bạn có cân nhắc thêm một danh sách SWT đơn giản không (http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.platform .doc.isv% 2Freference% 2Fapi% 2Forg% 2Feclipse% 2Fswt% 2Fwidgets% 2FList.html) đối tượng để xem của bạn thay vì một tableviewer vv vv – nbz

+0

Ngoài ra nó có thể là tốt hơn để sử dụng một ListViewer (http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc. isv% 2Freference% 2Fapi% 2Forg% 2Feclipse% 2Fjface% 2Fviewers% 2FListViewer.html) thay vì một TableViewer. – nbz

+0

Cảm ơn bạn đã nhập. Hiện tại nó chỉ là một danh sách nhưng tôi muốn thêm nhiều dữ liệu hơn vào các cột khác sau này. Việc sử dụng ListViewer có thay đổi cách tôi quan sát danh sách không? – Friederike

Trả lời

5

tôi khuyên bạn nên đọc JFace Databinding và tận dụng ViewerSupport, ObservableListContentProviderBeanProperties để đơn giản hóa công việc.

Bạn cũng có thể xem một ví dụ làm việc JFace Databinding Snippet: Model to TableViewer binding cho một tham chiếu, nơi mà các ràng buộc được thực hiện cuối cùng với sự giúp đỡ của ViewerSupport:

(...) 
TableViewer peopleViewer = new TableViewer(committers); 
ViewerSupport.bind(peopleViewer, new WritableList(viewModel.getPeople(), 
    Person.class), BeanProperties.value(Person.class, "name")); 

Với những người giúp đỡ bạn sẽ không cần phải thực hiện các Observer cho bạn và nếu bạn muốn người xem cập nhật nhãn của mình khi dữ liệu được sửa đổi, hãy xem trong ví dụ tương tự PropertyChangeSupport, cho phép bạn làm mới trình xem trên mọi thay đổi trên bất kỳ phần tử nào trong danh sách mà bạn thông báo qua đó. Điều quan trọng là bạn sử dụng BeanProperties để ràng buộc.

+0

Điều này có vẻ như một giải pháp tốt. Nhưng có cách nào để sử dụng trình duyệt tính hợp lệ và trình chuyển đổi với trình xem bảng bằng cách sử dụng tính năng này không? – Lii

1

Tôi không nghĩ có bất kỳ điều gì sai với cách tiếp cận của bạn với một ngoại lệ có thể xảy ra. Bạn cần đảm bảo rằng người xem được làm mới trong chuỗi giao diện người dùng:

Display.getDefault().asyncExec(new Runnable() { 
    @Override 
    public void run() { 
     viewer.refresh(); 
    } 
}); 

Tuy nhiên, có những điều bạn có thể làm để cải thiện bảng hiệu quả hơn. Trong mã của bạn ở trên nó dường như chỉ thêm một mục duy nhất ở phía trên cùng của bảng, vì vậy bạn muốn được tốt hơn với một cuộc gọi đến:

viewer.insert(text, 0); 
+0

Cảm ơn ghi chú trên chuỗi giao diện người dùng. Đối với việc tối ưu hóa với 'viewer.insert' tôi không nghĩ nó hiệu quả hơn. Tôi không thể chắc chắn những thay đổi đã được thực hiện cho mô hình của tôi. Vì vậy, tôi sẽ phải kiểm tra cập nhật/chèn/xóa. Đó là cách đắt hơn so với chỉ nhận được toàn bộ danh sách một lần nữa và hiển thị nó. ;) – Friederike

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