2

我有一个小问题,我正在寻求帮助。

我的 Master 部分有一个TableViewer,并且有很多条目会很快更新它。我的详细信息页面显示所选项目信息。我想让这个详细信息页面持久化,并且只有在选择发生变化时才会收到通知。

我面临的问题是,当向 tableviewer 添加新项目时,选择会自动更改。

编辑:我有一个更新的处理程序,TableViewer在列表的开头添加一个新项目,这是我的输入TableViewer

When the TableVieweris SWT.VIRTUALthe selection is on the index and when an item is added, the selected row is the same but items have moved.

何时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 回答