我正在编写一个 Eclipse-JFace-TreeViewer 并且最近注意到,每次我调用 setInput() 时,UI 线程都会被占用至少 10~30 毫秒,无论设置了什么输入。调用 setInput(null) 时也需要很长时间来处理。
我还做了一个带有虚拟内容提供者的 TreeViewer 的最小实现。问题仍然存在。你可以自己试试。也许它只在我的系统上。查看下面的代码。要刷新查看器,只需单击它。如果你的系统也有问题,光标应该闪烁并显示沙漏图标。
包 de.stef.swttools.test;导入 org.eclipse.jface.viewers.*;
公共类测试{
protected Shell shell; public static void main(String[] args) { new Test().open(); } public void open() { Display display = Display.getDefault(); createContents(); shell.open(); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } protected void createContents() { shell = new Shell(); shell.setSize(400, 400); shell.setLayout(new FillLayout(SWT.HORIZONTAL)); final TreeViewer treeViewer = new TreeViewer(shell, SWT.VIRTUAL); treeViewer.setContentProvider(new ITreeContentProvider() { @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public Object[] getElements(Object inputElement) { return new Object[] {}; } @Override public Object[] getChildren(Object parentElement) { return new Object[] {}; } @Override public Object getParent(Object element) { return null; } @Override public boolean hasChildren(Object element) { return false; } }); treeViewer.getTree().addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { treeViewer.setInput(null); } }); }
}