2013-06-28 2 views
1

В этом проблема. У меня есть следующий класс FileNode, который проходит DefaultMutableTreeNodeClassCastException в Linux, но не 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; 
    } 
} 

Самое странное, что я только получаю эту ошибку в 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) 
+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; 
    } 
} 

Это изменение будет проверять, что value является FileNode перед выполнением броска. Если его не FileNode, он будет рисовать значение в черном, а не рушиться в этот момент.

В целом, его хорошая практика проверяется перед выполнением броска, поэтому вы можете правильно ее обрабатывать во избежание того, что объект на самом деле не закрыт.

+0

Спасибо, Это сработало - используя instanceof - и все мои файлы выглядят цветными. Кажется странным, что он работал на Windows, а не на Linux. Теперь он работает на обоих. – user1819780

+0

Не могли бы вы добавить некоторый журнал, чтобы проверить, что еще получает этот метод в Linux? Теперь мне интересно, какой класс можно получить для создания CCE только в Linux. –

+0

Я рад, что это сработало. Если вы счастливы, что ваша проблема решена, пожалуйста, «отметьте» ответ, чтобы все знали, что есть решение вашей проблемы. – wattostudios