2012-12-07 67 views
2

我有一個小問題,我正在尋求幫助。TableViewer選擇變化

我有一個TableViewer在我的主人部分和很多條目更新非常快。 我的詳細信息頁面顯示選定的項目信息。 我想使這些細節頁面保持不變,只有在選擇發生變化時纔會收到通知。

我面臨的問題是,當一個新項目添加到tableviewer時,選擇自動改變。

編輯:我有一個處理程序更新TableViewer,添加一個新的項目在我的TableViewer的輸入列表的開頭。

TableViewerSWT.VIRTUAL時,選擇位於索引上,並且添加項目時,所選行相同但項目已移動。

TableViewer不是SWT.VIRTUAL選擇發生在對象上但性能非常低!

任何建議? 謝謝

public void update(Object obj_p) { 
    if (obj_p instanceof IMessageEvent) { 
     IMessageEvent event = (IMessageEvent) obj_p; 
     synchronized (_currentListEvents) { 
      _currentListEvents.addFirst(event); 
      if (_currentListEvents.size() > _maxEvents) { 
       _currentListEvents.removeLast(); 
      } 
     } 
    } 
    if (null == obj_p) { 
     synchronized (_currentListEvents) { 
      _currentListEvents.clear(); 
     } 
    } 
} 
+0

將新項目添加到tableviewer時,選擇更改事件不會自動發生。你如何添加這個新項目? – Behnil

+0

我將它添加到update()方法中。事實是,當我的TableViewer不是SWT.VIRTUAL時,選擇不會改變。 – Goui

+0

你可以在這裏發佈一些代碼嗎?尤其是將新項目添加到TableViewer時的部分。 – Behnil

回答

1

當創建TableViewer的使用SWT.FULL_SELECTION風格。

有一個簡單的可運行代碼。它的行爲與您發佈的完全一樣,選擇正在改變,但是當您使用註釋的TableViewer構造函數時,它適用於我。

import java.util.ArrayList; 
import java.util.List; 

import org.eclipse.jface.viewers.ArrayContentProvider; 
import org.eclipse.jface.viewers.ISelectionChangedListener; 
import org.eclipse.jface.viewers.LabelProvider; 
import org.eclipse.jface.viewers.SelectionChangedEvent; 
import org.eclipse.jface.viewers.StructuredSelection; 
import org.eclipse.jface.viewers.TableViewer; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 

public class TestCase { 

private static List<String> model = new ArrayList<String>(); 
private static TableViewer viewer; 

public static void main(String[] args) { 
    final Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setLayout(new FillLayout()); 

// viewer = new TableViewer(shell, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL); 
    viewer = new TableViewer(shell, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL); 

    viewer.getTable().setHeaderVisible(true); 
    viewer.getTable().setLinesVisible(true); 
    viewer.setUseHashlookup(true); 

    viewer.setContentProvider(ArrayContentProvider.getInstance()); 
    viewer.setLabelProvider(new LabelProvider()); 

    model.add("element2"); 
    model.add("element1"); 
    model.add("element0"); 

    viewer.setInput(model); 

    viewer.setSelection(new StructuredSelection(model.get(1))); 

    viewer.addSelectionChangedListener(new ISelectionChangedListener() { 

     @Override 
     public void selectionChanged(SelectionChangedEvent event) { 
      System.out.println("selection changed"); 
     } 
    }); 

    addContent(); 

    shell.setSize(400, 400); 
    shell.open(); 

    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
} 

private static void addContent() { 
    Display.getCurrent().timerExec(2000, new Runnable() { 

     @Override 
     public void run() { 
      model.add(0, "element" + model.size()); 
      viewer.refresh(); 
      addContent(); 
     } 
    }); 
} 

} 
+0

thx,但SWT.FULL_SELECTION是一次選擇所有的列,順便說我的TableViewer一直是SWT.FULL_SELECTION。 – Goui

+0

我知道它的確如此,但是使用了這種風格,它保留了選擇。沒有它,選擇總會隨着你所提到的而改變。 – Behnil

+0

當TableViewer是SWT.VIRTUAL – Goui