我有一点问题,我正在寻求帮助。
我的主人部分有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();
}
}
}
答案 0 :(得分: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();
}
});
}
}