我写了非常大的懒汉树模型,并不能给出路径编程展开如何扩展SWT/Tree和/或JFace/TreeViewer中的给定路径?
下面是整个ViewPart
代码。
树以交互方式良好工作,即我可以打开所有级别高达10.但我不能以编程方式。
我写了自定义ViewElementComparer
来比较元素。
package try_13_expandtreeview;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.IElementComparer;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
public class View extends ViewPart {
public static final String ID = "Try_13_ExpandTreeView.view";
private TreeViewer viewer;
private Action action1;
/**
* Each model element is a "triad", i.e. new Object[3]
*
* First element of a triad is a parent element
*
* Second number is a level, numbered from leafs to root
*
* Third number is numeric value (content) of an element
*
* @author dims
*
*/
class ViewContentProvider implements ITreeContentProvider {
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object parent) {
return getChildren(parent);
}
@Override
public Object[] getChildren(Object parent) {
Object[] triade = (Object[]) parent;
if(((int)triade[1]) > 0) {
Object[] children = new Object[10];
Object[] child;
for(int i=0; i<10; ++i) {
child = new Object[3];
child[0] = parent;
child[1] = ((int)triade[1])-1;
child[2] = i;
children[i] = child;
}
return children;
}
else {
return new Object[0];
}
}
@Override
public Object getParent(Object element) {
Object[] triade = (Object[]) element;
return triade[0];
}
@Override
public boolean hasChildren(Object element) {
Object[] triade = (Object[]) element;
return ((int)triade[1]) > 0;
}
}
class ViewLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
Object[] triade = (Object[]) element;
return ((Integer)triade[2]).toString();
}
}
class ViewElementComparer implements IElementComparer {
@Override
public boolean equals(Object a, Object b) {
Object[] triade_a = (Object[]) a;
Object[] triade_b = (Object[]) b;
return ((int)triade_a[2]) == ((int)triade_b[2]);
}
@Override
public int hashCode(Object element) {
Object[] triade = (Object[]) element;
return ((int)triade[2]);
}
}
/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setComparer(new ViewElementComparer());
viewer.setInput(new Object[] {null, 10, 0});
action1 = new Action() {
public void run() {
TreePath[] treePaths = {
new TreePath(new Object[] {
new Object[] {null, 0, 2},
new Object[] {null, 0, 7},
new Object[] {null, 0, 4}
})
};
// viewer.setExpandedTreePaths(treePaths); // does not work
viewer.expandToLevel(treePaths[0], TreeViewer.ALL_LEVELS);
//viewer.setExpandedElements(new Object[] { viewer.getTree().getItems()[3].getData()});
}
};
action1.setText("Action 1");
action1.setToolTipText("Action 1 tooltip");
action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
getViewSite().getActionBars().getToolBarManager().add(action1);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
}
好吧我理解了方法的正确性,但不明白它的有效性。假设我有明确的路径,但末尾有许多相同的叶子。为什么从最后开始搜索?这将会给无数的候选人!为什么不从根到叶搜索? – Dims
添加了一些关于如何阅读内部操作的更多信息 –
它对我无效。库代码看起来很奇怪;就好像它浏览的不是我的树层次结构,而是视觉控件层次结构。有时'org.eclipse.jface.viewers.StructuredViewer.findItems(Object)'不起作用。 – Dims