Pergunta

Eu estou atualmente refatoração um JTable que exibe uma variedade de diferentes tipos de dados. A principal razão para esta refatoração é que há um ClassCastExceptions poucos (o autor / amigo que escreveu o código está fora em hiato), e eu não consigo encontrar onde estes são provenientes. Devido à grande base de código, eu estou em uma perda a respeito de onde começar. Alguém tem alguma sugestão? Eu percebo e pedir desculpas para a ambiguidade dessa pergunta!

Eu incluí o rastreamento de pilha abaixo. Thanks !!

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

Solução

Este erro que está ocorrendo em BooleanRenderer é porque ele está esperando que o valor que é a partir do modelo da tabela é do tipo Boolean e tenta lançar para ele (a resposta de akf tem a linha exata do código onde ocorre).

Meu palpite é que, inicialmente, era esperado que o modelo iria retornar valores Boolean para a coluna dada, mas em um ponto ele está retornando cordas em seu lugar. Portanto, gostaria de me concentrar no que modelo está sendo usado para essa determinada tabela (é um modelo personalizado? É o modelo padrão onde ele está adicionando valores a ele?) E ver onde ele pode estar recebendo uma String em vez de um Boolean.

Outras dicas

Provavelmente a tabela contém uma caixa de seleção (quando os estados modelo coluna que a coluna contém tipo boolean) e as tentativas de renderização para converter o conteúdo em um boolean. Mas, provavelmente, os conteúdos são apenas strings. A solução é alterar os dados na tabela ou para criar seu próprio processador.

Eu acho que o problema vem do seu TableModel (jtable.getModel ()) Ele disse em algum lugar

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

mas o valor no seu modelo nesta coluna é uma String

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

Para depurar esse problema, você pode querer considerar a morder a bala e colocar um ponto de interrupção no JTable$BooleanRenderer.getTableCellRendererComponent() na linha que faz o elenco

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

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

e verificar o tipo de classe de value. quando você encontrar um String, você pode identificar a coluna ofender e linha de seu modelo. Isso, pelo menos, dar-lhe um começo na identificação do problema.

Infelizmente para desenterrar uma velha questão, mas eu corri para este problema eu mesmo & este post veio em uma pesquisa e é isso que eu corri em.

Eu tive testes JUnits falhar (e realmente lançar exceções de tempo de execução), mas eu continuei a correr add / remove no meu JTable (no teste JUnit) que colocou o aplicativo GUI em mau estado, e gostaria de ver a ClassCastException chegar exatamente como Chris tinha descrito.

Assim, a "solução" para mim foi ter certeza de que todos os testes de unidade pegar suas exceções e falhas de retorno em vez de proceder para executar mais testes de unidade.

Eu tive o mesmo problema, ea causa era exatamente como Avrom especificado. No meu caso, tive a getValueAt implementado 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
  }
}

O problema aqui é que, se uma fila não existe, uma String é devolvido, para cada coluna. No entanto, algumas de minhas colunas tem o tipo de classe, booleano, e, portanto, a exceção:

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)

A solução foi simplesmente para mudar o valor de retorno a:

return null;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top