2013-06-28 28 views
1

这是问题所在。我有以下类扩展DefaultMutableTreeNode的FileNodeLinux中的ClassCastException但不包括Windows - 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; 
    } 
} 

奇怪的是,我只在Windows在Linux中得到这个错误不是。我在两个平台上运行相同的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) 
+1

粘贴堆栈跟踪。 –

+0

您能否将异常的完整堆栈跟踪添加到您的问题中,以便我们了解问题发生的位置以及原因。 – wattostudios

回答

2

没有一个堆栈跟踪转储,它很难看到问题正在发生,但假设它在你发布的代码,我猜它可能是你的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; 
    } 
} 

这一变化将检查valueFileNode执行转换之前。如果它不是FileNode,它将以黑色绘制该值,而不是在此时崩溃。

一般来说,它是在执行转换之前检查的良好实践,所以您可以在对象实际上不可转换的机会中正确处理它。

+0

谢谢,这个工作 - 使用instanceof - 我的所有文件都是彩色的。看起来奇怪,它在Windows而不是Linux上工作。现在它适用于两者。 – user1819780

+0

你可以添加一些日志来检查还有什么在Linux中接收该方法?现在我很好奇什么类可以收到只在Linux中生成一个CCE –

+0

我很高兴它的工作。如果您很高兴您的问题得到解决,请“勾选”答案,以便每个人都知道问题的解决方案。 – wattostudios

相关问题