[英]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.