Frage

Ich bin Refactoring derzeit eine JTable, die eine Vielzahl von verschiedenen Arten von Daten angezeigt werden. Der Hauptgrund für dieses Refactoring ist, dass es ein paar ClassCastExceptions (der Autor / Freund, der Code auf Hiatus ist off schrieb), und ich kann nicht scheinen zu finden, wo diese von Ursprung. Aufgrund der großen Code-Basis, bin ich ratlos, wo ich anfangen soll. Hat jemand irgendwelche Vorschläge? Ich stelle fest, und entschuldigen uns für die Zweideutigkeit dieser Frage!

Ich habe den Stack-Trace enthalten. Dank !!

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)
War es hilfreich?

Lösung

Dieser Fehler, die in BooleanRenderer auftreten, weil es erwartet, dass der Wert, der aus der Tabelle des Modell ist vom Typ Boolean ist und versucht, sie (akf Antwort hat die genaue Codezeile, wo sie auftritt) zu werfen.

Meine Vermutung ist, dass zunächst wurde erwartet, dass das Modell Boolean Werte für die gegebene Spalte zurückgeben würde, aber an einem Punkt wird es Strings statt zurück. Daher würde ich auf das konzentrieren, was Modell für diese bestimmte Tabelle verwendet wird (ist es ein benutzerdefiniertes Modell? Ist es das Standard-Modell, bei dem es Werte, um es hinzufügt?) Und sehen, wo es einen String statt eines Boolean werden zu bekommen.

Andere Tipps

Wahrscheinlich enthält die Tabelle eine Checkbox (wenn die Spalte Modell besagt, dass der Spalt Typen Boolean enthält) und der Renderer versucht, den Inhalt in einen boolean zu konvertieren. Aber wahrscheinlich die Inhalte sind nur Strings. Die Lösung besteht darin, die Daten in der Tabelle zu ändern oder Ihren eigenen Renderer zu erstellen.

Ich denke, das Problem von Ihrem Tablemodel kommt (jtable.getModel ()) Es wird gesagt, irgendwo

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

aber der Wert in Ihrem Modell in dieser Spalte ist ein String

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

Um dieses Problem zu debuggen, können Sie die Kugel betrachten wollen beißen und einen Haltepunkt in den JTable$BooleanRenderer.getTableCellRendererComponent() aufs Spiel zu setzen, die die Besetzung macht

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

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

und prüfen Sie den Klassentyp von value. wenn Sie einen String finden, können Sie die fehlerhafte Spalte und Zeile aus dem Modell identifizieren. Das wird zumindest gibt Ihnen einen Start auf das Problem zu identifizieren.

Leider eine alte Frage zu graben, aber ich lief in dieser Frage mich auf diese Post kam in der Suche und das ist, was ich lief in.

hatte ich JUnits Tests fehlschlagen (und Runtime-Ausnahmen werfen tatsächlich), aber ich fuhr fort / zu laufen hinzufügen auf meiner JTable (im JUnit-Test) entfernt, die die GUI-Anwendung in einem schlechten Zustand versetzt, und ich würde der Classcast kommen sehen genau wie Chris beschrieben hatte.

So ist die „Fix“ für mich war, um sicher zu stellen, dass alle Unit-Tests ihre Ausnahmen fangen und zurück Scheitern statt Vorgehen mehr Unit-Tests laufen zu lassen.

Ich hatte das gleiche Problem und die Ursache war genau so, wie Avrom angegeben. In meinem Fall hatte ich die getValueAt umgesetzt wie:

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

Das Problem hier ist, dass es eine Reihe nicht existiert, ein String zurückgegeben wird, für jede Spalte. Doch einige meiner Spalten haben den Klassentyp, Boolean und damit die Ausnahme:

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)

Die Lösung war einfach den Rückgabewert zu ändern:

return null;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top