2013-06-28 33 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

相關問題