Pregunta

Estoy actualmente la refactorización de una JTable que muestra una multitud de diferentes tipos de datos.La razón principal para esta refactorización es que hay un par de ClassCastExceptions (el/la autor / amigo que escribió el código está en hiato), y me parece que no puede encontrar donde estos se originan a partir de.Debido a la gran base de código, estoy en una pérdida en cuanto a por dónde empezar.¿Alguien tiene alguna sugerencia?Me doy cuenta y pedir disculpas por la ambigüedad de esta pregunta!

He incluido el seguimiento de la pila siguiente.Gracias!!

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)
¿Fue útil?

Solución

Este error que se está produciendo en BooleanRenderer se debe a que está a la espera de que el valor que es a partir del modelo de la mesa es de tipo Boolean y trata de echar a ella (la respuesta de akf tiene la línea exacta de código en la que se produce).

Mi conjetura es que en un principio se esperaba que el modelo sería devolver valores Boolean para la columna especificada pero en un momento se está volviendo cuerdas en su lugar. Por lo tanto, me concentro en qué modelo se está utilizando para esta tabla dada (se trata de un modelo personalizado? ¿Es el modelo por defecto donde se está agregando valores a ella?) Y ver a dónde podría estar recibiendo una cadena en lugar de un Boolean.

Otros consejos

Probablemente, la tabla contiene una casilla de verificación (cuando el modelo de columna establece que la columna contiene tipo booleano) y el procesador intenta convertir el contenido en un booleano. Pero, probablemente, los contenidos son sólo cadenas. La solución es cambiar los datos de la tabla o para crear su propio procesador.

Creo que el problema viene de su TableModel (jtable.getModel ()) Se dijo en algún lugar

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

pero el valor de su modelo en esta columna es una cadena

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

Para depurar este problema, es posible que desee considerar la posibilidad de morder la bala y poner un punto de interrupción en el JTable$BooleanRenderer.getTableCellRendererComponent() en la línea que hace el reparto

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

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

y compruebe el tipo de clase de value. cuando encuentre un String, se puede identificar columna y fila del infractor de su modelo. Eso, al menos, darle un nuevo comienzo en la identificación del problema.

Lo sentimos para desenterrar una vieja pregunta, pero me encontré con este problema a mí mismo y este post vino en una búsqueda y esto es lo que me encontré.

Yo tenía pruebas JUnits fallan (y, de hecho lanzar excepciones de tiempo de ejecución), pero seguir corriendo añadir / quita en mi JTable (en la prueba JUnit) que puso la aplicación GUI en mal estado, y me gustaría ver el ClassCastException llegar exactamente como Chris había descrito.

Así que el "arreglo" para mí era asegurarse de que todas las pruebas unitarias cogen sus excepciones y el fracaso lugar de proceder a ejecutar las pruebas unitarias más volver.

Yo tenía el mismo problema, y la causa fue exactamente como Avrom especificado.En mi caso, tuve la getValueAt implementar como:

@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
  }
}

El problema aquí es que, es una fila no existe, una Cadena que se devuelve, para cada columna.Sin embargo, algunas de mis columnas tiene el tipo de clase, Boolean, y por lo tanto la excepción:

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 solución fue simplemente cambiar el valor de retorno para:

return null;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top