簡體   English   中英

Linux中但不是Windows中的ClassCastException-DefaultMutableTreeNode

[英]ClassCastException in Linux but not Windows - DefaultMutableTreeNode

這是問題所在。 我有以下類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;
    }
}

此更改將在執行FileNode之前檢查該value是否為FileNode 如果不是FileNode ,它將以黑色繪制該值,而不是此時崩潰。

通常,在執行強制轉換之前進行檢查是一種很好的做法,因此可以在對象實際上不可強制轉換的情況下正確處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM