2012-07-07 68 views
0

我在專門的查看器旁邊有一個樹查看器。在樹狀視圖中選擇某些內容時,關於此對象的詳細信息將顯示在專用查看器中。 TreeViewer tree,Composite controlMySpecializedViewer viewer是實例變量。複合的動態刷新

public TheEverythingViewer(Composite parent) { 
    control = new Composite(parent, SWT.NONE); 
    control.setLayout(new GridLayout(2, false)); 

    tree = new TreeViewer(control); 
    tree.setContentProvider(new MyContentProvider()); 
    tree.setLabelProvider(new MyLabelProvider()); 
    tree.setUseHashlookup(true); 
    tree.getControl().setLayoutData(new GridData(GridData.BEGINNING, GridData.FILL, false, true, 1, 1)); 

    tree.addSelectionChangedListener(new ISelectionChangedListener() { 
     @Override public void selectionChanged(SelectionChangedEvent event) { 
      try { 
       IStructuredSelection sel = (IStructuredSelection) event.getSelection(); 
       MyClass myInput = (MyClass) sel.getFirstElement(); 

       if (viewer != null) 
        if (!viewer.getControl().isDisposed()) 
         viewer.getControl().dispose(); 
       viewer = new MySpecializedViewer(control, table); 

       control.getShell().layout(); 
      } catch (Exception e) { 
       if (viewer != null) 
        if (!viewer.getControl().isDisposed()) 
         viewer.getControl().dispose(); 
       viewer = null; 
      } 
     } 
    }); 
} 

我做錯了什麼?我只是想:

+--------------+--------------------------------------------+ 
| + Node  |           | 
| - Node  |           | 
| + Node  |      My     | 
|  - Node |           | 
| - Node  |  Specialized       | 
|    |        Viewer  | 
|    |           | 
|    |           | 
|    |           | 
|    |           | 
|    |           | 
|    |           | 
|    |    +--------+     | 
|    |    |  |     | 
|    |    |  |     | 
|    |    |  |     | 
|    |    +--------+     | 
|    |           | 
|    |           | 
|    |           | 
|    |           | 
+--------------+--------------------------------------------+ 

專門的查看器有一些表,根據所選節點需要消耗更多或更少的空間。目前,創建專用查看器的新實例要比改變其輸入要簡單得多(這不適用於ATM)。

回答

2

是的,你不應該在樹中每次選擇改變時都重新創建查看器,你應該將樹的選擇發送給現有的查看器作爲它的輸入,此時它可以做你想做的任何事情與新的輸入。您也從來沒有在專門的查看器控件上設置佈局數據,然後強制整個shell重新佈局是浪費的。

+1

不重新創建查看器涉及到更改表的結構。如果我不強制shell重新佈局,我可以調用什麼方法(在什麼對象上)來實現更新UI的愚蠢行爲?我從來沒有見過'someControl.redraw()'實際上在這種情況下工作。 – 2012-07-07 14:12:06

+1

什麼表?沒有提到一張桌子。 *如何重新創建觀衆需要改變結構? pack()和layout()是父級Composite,而不是整個Shell。 – nitind 2012-07-07 17:39:14

+1

我在最後提到,「專門的查看器具有需要消耗更多或更少空間的表,取決於所選節點。」 pack()和layout()方法似乎在做伎倆。現在我正在處理一個有趣的錯誤,每個'pack();佈局();',表格會消耗更多的寬度,父親進度越來越遠,並越過組合邊緣。 – 2012-07-08 03:38:11