java - Linux 中存在 ClassCastException,但 Windows 中不存在 - DefaultMutableTreeNode

标签 java classcastexception

问题就在这里。我有以下 FileNode 类,它扩展了 DefaultMutableTreeNode

import javax.swing.tree.DefaultMutableTreeNode;
import java.io.File;

public class FileNode extends  DefaultMutableTreeNode {
    public FileNode(String Name, File File) {
        super(Name);
        this.Name = Name;
        this.File = File;
        this.isFolder = false;
        CheckedOut = false;
    }

    public FileNode(String Name, File File, Boolean isFolder) {
        super(Name);
        this.Name = Name;
        this.File = File;
        this.isFolder = isFolder;
        CheckedOut = false;
    }

    public Boolean CheckedOut;
    public File File;
    public String Name;
    public Boolean isFolder;
}

我有一棵充满这些节点的树。

我遇到了以下情况的转换异常:

private class FileTreeCellRenderer extends DefaultTreeCellRenderer {
    public Component getTreeCellRendererComponent(JTree tree, Object value,
          boolean sel, boolean expanded, boolean leaf,
          int row, boolean hasFocus) {
        super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
           row, hasFocus);
        FileNode fn = (FileNode)value;
        Color nodeColor = Color.BLACK;
        if (!fn.isFolder) {
            if (fn.CheckedOut) {
              nodeColor = Color.RED;
            } else {
              nodeColor = new Color(0,100,0);
            }
        }
        setForeground(nodeColor);
        return this;
    }
}

奇怪的是,我只在 Linux 中遇到这个错误,在 Windows 中却没有。我在两个平台上运行相同的 JRE - Oracle JDK 1.7.0_25

有人知道我做错了什么吗?

这是堆栈跟踪:

Exception in thread "main" java.lang.ClassCastException: javax.swing.tree.DefaultMutableTreeNode cannot be cast to dropboxcheckout.FileNode
    at dropboxcheckout.CheckoutPanel$FileTreeCellRenderer.getTreeCellRendererComponent(CheckoutPanel.java:115)
    at javax.swing.plaf.basic.BasicTreeUI$NodeDimensionsHandler.getNodeDimensions(BasicTreeUI.java:2786)
    at javax.swing.tree.AbstractLayoutCache.getNodeDimensions(AbstractLayoutCache.java:492)
    at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.updatePreferredSize(VariableHeightLayoutCache.java:1359)
    at javax.swing.tree.VariableHeightLayoutCache.updateNodeSizes(VariableHeightLayoutCache.java:917)
    at javax.swing.tree.VariableHeightLayoutCache.invalidateSizes(VariableHeightLayoutCache.java:371)
    at javax.swing.plaf.basic.BasicTreeUI.setCellRenderer(BasicTreeUI.java:385)
    at javax.swing.plaf.basic.BasicTreeUI$Handler.propertyChange(BasicTreeUI.java:3390)
    at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
    at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327)
    at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
    at java.awt.Component.firePropertyChange(Component.java:8382)
    at javax.swing.JTree.setCellRenderer(JTree.java:759)
    at dropboxcheckout.CheckoutPanel.<init>(CheckoutPanel.java:85)
    at dropboxcheckout.CheckoutFrame.<init>(CheckoutFrame.java:37)

最佳答案

如果没有堆栈跟踪转储,很难看出问题发生在哪里,但假设它在您发布的代码中,我猜测它可能是您的 FileNode 转换。

我的建议是正确处理这个异常,无论它运行在什么系统上......

private class FileTreeCellRenderer extends DefaultTreeCellRenderer {
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);

        Color nodeColor = Color.BLACK;

        if (value instanceof FileNode){
            FileNode fn = (FileNode)value;
            if (!fn.isFolder) {
                if (fn.CheckedOut) {
                    nodeColor = Color.RED;
                }
                else {
                    nodeColor = new Color(0,100,0);
                }
            }
        }

        setForeground(nodeColor);
        return this;
    }
}

此更改将在执行转换之前检查 value 是否为 FileNode。如果它不是 FileNode,它会将值绘制为黑色,而不是在此时崩溃。

一般来说,在进行强制转换之前进行检查是一个很好的做法,这样您就可以在对象实际上不可强制转换的情况下正确处理它。

关于java - Linux 中存在 ClassCastException,但 Windows 中不存在 - DefaultMutableTreeNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17359153/

相关文章:

java - 如何从图像按钮获取位图

Java 类让我非常困惑

java - 应用 PathProperties 后出现 ClassCastException

java - 解析 csv 文件并存储结果,因为 JFree 图表数据集消耗堆空间

java - Maven 依赖相同版本的不同 jar

java - UpdateHandler,只有当触发器为真时才做一件事,Android

java - Android DefaultSharedPreferences 字符串而不是整数

java - 在java中单独访问列表元素时出现ClassCastException

java - 如何在 HashMap 中添加和获取类的对象值

Java 泛型导致类转换错误