有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法创建部件的控制树查看器。类卡斯特例外

我想在我的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


共 (1) 个答案

  1. # 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;
    }