【问题标题】:Failed to create the part's control treeviewer. ClassCastException未能创建部件的控件树形查看器。 ClassCastException
【发布时间】:2015-06-21 05:14:45
【问题描述】:

我想在我的 RCP 应用程序中创建一个项目树浏览器。
这是我对树的视图:

public class ProjectExplorer extends ViewPart{  
    public static final String ID = "rcp.projectexplorer";
    public ProjectExplorer() {
    }
    private TreeViewer viewer;
    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.setInput(ProjectManager.getInstance().getProjects().toArray());
    }

    @Override
    public void setFocus() {
        viewer.getControl().setFocus();
    }

}

ProjectManager.getInstance().getProjects().toArray() - 返回当前项目的数组。 每个项目都实现了接口IProjectNode
在 ContentProvider 方法 Object[] getElements(Object inputElement) 我尝试将项目 (inputElement) 从 Object[] 转换为 IProjectNode[]

public class ViewContentProvider implements ITreeContentProvider {

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

    @Override
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        // TODO Auto-generated method stub

    }

    @Override
    public Object[] getElements(Object inputElement) {
        return (IProjectNode[])inputElement;
    }

    @Override
    public Object[] getChildren(Object parentElement) {
        return ((IProjectNode)parentElement).getChildren();
    }

    @Override
    public Object getParent(Object element) {
        // TODO Auto-generated method stub
        return ((IProjectNode)element).getParent();
    }

    @Override
    public boolean hasChildren(Object element) {
        if (((IProjectNode)element).getChildren() == null)
            return true;
        return false;
    }

}

但我有以下错误:“无法创建部件的控件”。

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lrcp.projects.source.IProjectNode;
at rcp.projects.ViewContentProvider.getElements(ViewContentProvider.java:24)
at org.eclipse.jface.viewers.StructuredViewer.getRawChildren(StructuredViewer.java:999)
at org.eclipse.jface.viewers.ColumnViewer.getRawChildren(ColumnViewer.java:699)

项目中的每个孩子也实现IProjectNode

我该如何解决这个异常?我做错了什么?
有关子方法的信息:

public boolean hasChildren(Object element) {'
        if (((IProjectNode)element).getChildren() == null)
            return false;
        return true;
    }


在项目类中实现“getChildren()”:

public IProjectNode[] getChildren() {
        IProjectNode[] projectNodes = {
                settingsFile,
                ldlFile,
                pythonFolder,
                outFolder
                };
        return projectNodes;
    }


settingsFile, ldlFile, pythonFolder, outFolder 也实现了IProjectNode

【问题讨论】:

  • 您是否尝试过将Object 逐一转换为IProjectNode,而不是从LObject 转换为LIProjectNode

标签: java eclipse treeview rcp classcastexception


【解决方案1】:

ProjectManager.getInstance().getProjects().toArray();

toArray() 方法返回一个 Object 数组,您不能将其转换为 IProjectNode 数组(即使实际内容是这些节点的数组)。

改为使用:

ProjectManager.getInstance().getProjects().toArray(new IProjectNode[0]);

toArray 的这种形式确实返回了 IProjectNode 的数组

当项目节点“getChildren”返回 null 时,您的 hasChildren 方法也返回“true”,而当实际有子节点时返回“false”。你需要这样的东西:

@Override
public boolean hasChildren(Object element) {
    return ((IProjectNode)element).getChildren() != null;
}

【讨论】:

  • 谢谢!这行得通!但我只看到树中的根元素。儿童不显示。
  • 对不起,我不知道如何在 cmets 中格式化。我在主要问题中添加了信息。
  • 您不能在 cmets 中进行格式化。这是一个新问题,我们已经解决了您原来的问题,所以我建议您将此答案标记为已接受,然后提出一个新问题。
  • 我发布了一个新问题。如果你能帮助我。 Question is there.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多