Java TableViewer选择更改

Java TableViewer选择更改,java,block,jface,master-detail,tableviewer,Java,Block,Jface,Master Detail,Tableviewer,我有点小问题,我正在寻求帮助 我的主控部分中有一个TableViewer,有很多条目可以很快更新它。 “我的详细信息”页面显示所选项目信息。 我想使此详细信息页面持久化,并且仅当选择发生更改时才会收到通知 我面临的问题是,当一个新项目添加到tableviewer中时,选择会自动更改 编辑:我有一个处理程序,用于更新TableViewer,在列表的开头添加一个新项目,该列表是我的TableViewer的输入 当TableViewer为SWT.VIRTUAL时,所选内容位于索引上,添加项目时,所选行

我有点小问题,我正在寻求帮助

我的主控部分中有一个
TableViewer
,有很多条目可以很快更新它。 “我的详细信息”页面显示所选项目信息。 我想使此详细信息页面持久化,并且仅当选择发生更改时才会收到通知

我面临的问题是,当一个新项目添加到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();
        }
    }
}

创建TableViewer时,请使用SWT.FULL_选择样式

有一个简单的可运行代码。它的行为与您发布的完全相同,选择正在更改,但当您使用已注释的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();
        }
    });
}

}
import java.util.ArrayList;
导入java.util.List;
导入org.eclipse.jface.viewers.ArrayContentProvider;
导入org.eclipse.jface.viewers.iSelectChangedListener;
导入org.eclipse.jface.viewers.LabelProvider;
导入org.eclipse.jface.viewers.SelectionChangedEvent;
导入org.eclipse.jface.viewers.StructuredSelection;
导入org.eclipse.jface.viewers.TableViewer;
导入org.eclipse.swt.swt;
导入org.eclipse.swt.layout.FillLayout;
导入org.eclipse.swt.widgets.Display;
导入org.eclipse.swt.widgets.Shell;
公共类测试用例{
私有静态列表模型=新的ArrayList();
私有静态表查看器;
公共静态void main(字符串[]args){
最终显示=新显示();
最终外壳=新外壳(显示);
setLayout(新的FillLayout());
//查看器=新的TableViewer(shell,SWT.SINGLE | SWT.FULL | U SELECTION | SWT.H | U SCROLL | SWT.V | U SCROLL | SWT.VIRTUAL);
查看器=新的TableViewer(shell,SWT.SINGLE | SWT.H| u SCROLL | SWT.V|u SCROLL | SWT.VIRTUAL);
viewer.getTable().setheadervible(true);
viewer.getTable().setLinesVisible(true);
viewer.setUseHashlookup(true);
setContentProvider(ArrayContentProvider.getInstance());
setLabelProvider(新的LabelProvider());
模型。添加(“元素2”);
型号。添加(“元素1”);
模型。添加(“元素0”);
viewer.setInput(模型);
viewer.setSelection(新结构选择(model.get(1));
viewer.addSelectionChangedListener(新的ISelectionChangedListener(){
@凌驾
公共作废selectionChanged(SelectionChangedEvent事件){
System.out.println(“选择更改”);
}
});
addContent();
外壳设置尺寸(400400);
shell.open();
而(!shell.isDisposed()){
如果(!display.readAndDispatch()){
display.sleep();
}
}
}
私有静态void addContent(){
Display.getCurrent().timerExec(2000,新的Runnable()){
@凌驾
公开募捐{
model.add(0,“元素”+model.size());
viewer.refresh();
addContent();
}
});
}
}

将新项目添加到tableviewer时,选择更改事件不会自动发生。如何添加此新项?我将在update()方法中添加它。事实上,当我的TableViewer不是SWT.VIRTUAL时,选择不会改变。你能在这里发布一些代码吗?尤其是在TableViewer中添加新项目的部分。现在我明白了,这非常有趣。我会调查它。thx但是SWT.FULL_SELECTION是一次选择所有列,就像我的TableViewer一直都是SWT.FULL_SELECTION一样。我知道是这样,但是使用这种样式,它保留了选择。如果没有它,选择总是会像您提到的那样更改。当TableViewer为SWT时,它不会保留选择。虚拟机运行您的示例,并且即使使用已注释的lineWindows XP pro service pack 3,也不会为我保留选择