2

少し問題があり、助けを求めています。

マスター部分にがTableViewerあり、非常に迅速に更新するエントリがたくさんあります。詳細ページには、選択したアイテム情報が表示されます。この詳細ページを永続化し、選択が変更されたときにのみ通知されるようにしたいと思います。

私が直面している問題は、新しいアイテムがテーブルビューアに追加されると、選択が自動的に変更されることです。

TableViewer編集:私は、の入力であるリストの先頭に新しいアイテムを追加して、を更新するハンドラーを持っていTableViewerます。

TableViewer選択範囲がインデックスにあり、アイテムが追加されている場合SWT.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();
        }
    }
}
4

1 に答える 1

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();
        }
    });
}

}
于 2012-12-14T11:22:19.757 に答える