Question

Je refactorisation actuellement une JTable qui affiche une multitude de différents types de données. La raison principale de ce refactoring est qu'il ya quelques ClassCastExceptions (l'auteur / ami qui a écrit le code est désactivé en pause), et je ne peux pas à trouver où ceux-ci sont originaires de. En raison du grand codebase, je suis à une perte à l'endroit où commencer. Est-ce que quelqu'un a des suggestions? Je me rends compte et présente mes excuses pour l'ambiguïté de cette question!

J'ai inclus la trace de la pile ci-dessous. Merci !!

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
    at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(Unknown Source)
    at javax.swing.JTable.prepareRenderer(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
    at javax.swing.plaf.ComponentUI.update(Unknown Source)
    at javax.swing.JComponent.paintComponent(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent._paintImmediately(Unknown Source)
    at javax.swing.JComponent.paintImmediately(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Était-ce utile?

La solution

Cette erreur qui se produit dans BooleanRenderer est parce qu'il attend que la valeur qui est du modèle est de type Boolean de la table et tente de jeter à elle (la réponse de AKF a la ligne de code exacte où il se produit).

Je pense que d'abord il était prévu que le modèle retournerait des valeurs Boolean pour la colonne donnée, mais à un moment donné, il est de retour des chaînes au lieu. Par conséquent, je me concentrerais sur ce modèle est utilisé pour cette table (est-il un modèle personnalisé? Est-ce le modèle par défaut où il ajoute des valeurs à elle?) Et de voir où il peut être obtenir une chaîne au lieu d'un Boolean.

Autres conseils

Probablement la table contient une case à cocher (lorsque le modèle de la colonne indique que la colonne contient type booléen) et le moteur de rendu tente de convertir le contenu en un booléen. Mais sans doute le contenu ne sont que des chaînes. La solution est de changer les données de la table ou de créer votre propre moteur de rendu.

Je pense que le problème vient de votre TableModel (jtable.getModel ()) Il a dit quelque part

(..)
public Class<?> getColumnClass(int column)
   {
   switch(column)
     {
   (...)
      case XX: return Boolean.class;
      }
   }

mais la valeur de votre modèle dans cette colonne est une chaîne

public Object getValueAt(int row,int column)
  {
  (..)
   switch(column)
     {
   (...)
      case XX: return (a String);
      }
  }

Pour déboguer ce problème, vous voudrez peut-être envisager de mordre la balle et de mettre un point d'arrêt dans la JTable$BooleanRenderer.getTableCellRendererComponent() sur la ligne qui fait la distribution

setSelected((value != null && ((Boolean)value).booleanValue()));

(de JTable.java 1.288 06/11/15)

et vérifier le type de value de classe. lorsque vous trouvez un String, vous pouvez identifier la colonne incriminée et la ligne de votre modèle. Cela au moins vous donner un nouveau départ à identifier le problème.

Désolé de déterrer une vieille question, mais je suis tombé sur cette question moi-même et ce poste est venu dans une recherche, ce qui est ce que je suis tombé.

J'ai eu des tests de JUnits ne (et lancer effectivement des exceptions d'exécution) mais je continuais à courir ajouter / enlève sur ma JTable (dans le test JUnit) qui a mis l'application GUI dans un mauvais état, et je verrais le ClassCastException venir exactement comme Chris avait décrit.

Ainsi, la « solution » pour moi était de faire en sorte que tous les tests unitaires attrapent leurs exceptions et retour échec au lieu de procédure pour exécuter plusieurs tests unitaires.

J'ai eu le même problème, et la cause était exactement comme spécifié Avrom. Dans mon cas, j'avais le getValueAt mis en œuvre comme:

@Override
synchronized public Object getValueAt(int row, int col) {
  if (row < m_rows.size()) {
    return m_rows.get(row).getValueAt(col);
  } 
  else 
  {
    return "";  // THIS IS THE BUG
  }
}

Le problème ici est que, est une ligne n'existe pas, une chaîne est renvoyée, pour chaque colonne. Toutefois, certaines de mes colonnes a le type de classe, Boolean, et par conséquent l'exception:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
  at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(JTable.java:5409)
  at javax.swing.JTable.prepareRenderer(JTable.java:5736)

La solution était tout simplement de changer la valeur de retour à:

return null;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top