2009-10-16 47 views
10

Tôi đang cố lưu trạng thái mở rộng JFace TreeViewer để làm mới sau khi gọi phương thức setInput(). Tôi đã thử các phương thức getExpandedElements, setExpandedElements, getExpandedTreePaths, setExpandedTreePaths của TreeViewer nhưng nó không hoạt động.Lưu trạng thái TreeViewer trước khi setInput()

Object[] expandedElements = viewer.getExpandedElements(); 
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths(); 
viewer.setInput(); 
viewer.setExpandedElements(expandedElements); 
viewer.setExpandedTreePaths(expandedTreePaths); 

Trả lời

10

Bạn cần phải chắc chắn rằng nhà cung cấp nội dung TreeViewer của bạn cung cấp các đối tượng có hashCode của họ và equals phương pháp được xác định chính xác. AbstractTreeViewer cần có khả năng so sánh các đối tượng cũ và mới để xác định trạng thái mở rộng của chúng. Nếu hashCodeequals không được cung cấp, đây là một kiểm tra tham chiếu đơn giản, sẽ không hoạt động nếu bạn đã tạo lại nội dung của mình.

+0

Cảm ơn, nó hoạt động sau khi triển khai phương thức equals và hashset .. – penguru

3

Như đã đề cập trong this thread, hãy nhìn vào cuối ResourceNavigator, thuộc về gói org.eclipse.ui.views.navigator.
("muộn" vì lớp đó không còn được sử dụng trực tiếp, xem Eclipse Wiki).

alt text (như đã thấy trong eclipse Java Model)

Nó sử dụng một TreeViewer, và tiết kiệm các yếu tố mở rộng và các yếu tố được lựa chọn, trong số những trạng thái khác.
Các yếu tố mô hình là các đối tượng IResource, được tiếp tục sử dụng cơ chế IPersistableElement/IElementFactory.
Bộ điều hợp IPersistableElement được đăng ký với IResource trong lớp WorkbenchAdapter, nhưng thay vào đó, yếu tố mô hình này có thể được lấy trực tiếp bằng cách thực hiện trực tiếp IPersistableElement.
Tương ứng IElementFactory được khai báo trong một phần mở rộng elementFactory trong org.eclipse.ui.ide 's plugin.xml.

Tài nguyên đã khôi phục biết cách nhận con riêng (và cha mẹ), thông qua nhà cung cấp nội dung của cây, vì vậy không phải tất cả các yếu tố của cây cần được duy trì.

Cách tiếp cận tương tự có thể được sử dụng để lưu tài nguyên đầu vào của người xem.
Đối với ResourceNavigator, có mức độ gián đoạn ở đây thông qua khung hiện tại của FrameList, nhưng nếu bạn duyệt qua nó trong trình gỡ rối, bạn sẽ thấy rằng về cơ bản nó cũng làm như vậy.


chiết xuất nhỏ (nhưng phần còn lại của mã tiết kiệm cũng có nhiều thứ khác, bao gồm lựa chọn)

if (frameList.getCurrentIndex() > 0) { 
    //save frame, it's not the "home"/workspace frame 
    TreeFrame currentFrame = (TreeFrame) frameList.getCurrentFrame(); 
    IMemento frameMemento = memento.createChild(TAG_CURRENT_FRAME); 
    currentFrame.saveState(frameMemento); 
} else { 
    //save visible expanded elements 
    Object JavaDoc expandedElements[] = viewer.getVisibleExpandedElements(); 
    if (expandedElements.length > 0) { 
     IMemento expandedMem = memento.createChild(TAG_EXPANDED); 
     for (int i = 0; i < expandedElements.length; i++) { 
      if (expandedElements[i] instanceof IResource) { 
       IMemento elementMem = expandedMem 
         .createChild(TAG_ELEMENT); 
       elementMem.putString(TAG_PATH, 
         ((IResource) expandedElements[i]).getFullPath() 
           .toString()); 
      } 
     } 
    } 
    [...] 
} 
Các vấn đề liên quan