2009-06-10 3 views
0

В настоящее время я рефакторинг JTable, который отображает множество различных типов данных. Основная причина этого рефакторинга заключается в том, что несколько ClassCastExceptions (автор/друг, который написал код, отключен на паузе), и я не могу найти, откуда они происходят. Из-за большой базы кода я не понимаю, с чего начать. У кого-нибудь есть предложения? Я понимаю и извиняюсь за двусмысленность этого вопроса!Неизвестный источник ClassCastException (в JTables)

Я включил трассировку стека ниже. Благодаря!!

 
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) 
+0

Можем ли мы увидеть некоторые из кода создания таблицы ? Похоже, есть место, где есть строка, но таблица ожидает логическое значение. –

+0

Я бы с удовольствием, но код повсюду. Очень кошмар. Однако я столкнулся с тем, что я считаю основной проблемой. Я должен был упомянуть, что эти исключения возникают, когда содержимое строки сортируется с помощью 'TableRowSorter'. Проблема в том, что столбцы 'JTable' (а точнее один столбец) имеют несколько' CellRender', которые он может выбрать, и когда происходит сортировка, 'CellRender' не меняются. У меня есть метод, который теперь меняет их, но я не уверен, как вызвать метод после сортировки. –

+0

«RowSorterListener» прослушивает этот вид, но, к сожалению, он вызывает код до того, как происходит сортировка, что делает его бесполезным. Итак, я думаю, что моя текущая проблема заключается в том, как вызывать метод после завершения сортировки. Есть идеи? Спасибо за всю помощь, очень ценю :) –

ответ

3

Эта ошибка, которая возникает в BooleanRenderer, заключается в том, что она ожидает, что значение, которое находится в модели таблицы, относится к типу Boolean и пытается использовать его (ответ akf имеет точную строку кода, где он встречается).

Я предполагаю, что изначально ожидалось, что модель вернет значения Boolean для данного столбца, но в какой-то момент вместо этого вернет строки. Поэтому я хотел бы сосредоточиться на том, какая модель используется для данной таблицы (это настраиваемая модель? Является ли она моделью по умолчанию, где она добавляет к ней значения?) И посмотреть, где она может получить строку вместо Boolean ,

+0

Авром, ты абсолютно прав - спасибо. Если у вас есть момент/если вы заинтересованы, см. Мой выше комментарий к mmeyers о причине проблемы. –

2

Возможно таблица содержит флажок (если модель столбца указывается, что столбец содержит тип Boolean) и рендер пытается преобразовать содержимое в логическое значение. Но, вероятно, содержимое - это просто строки. Решение заключается в изменении данных в таблице или создании собственного средства визуализации.

+0

Bruno, Содержимое было не просто Strings - к сожалению, это была моя проблема. Моя колонка содержала все типы данных в дополнение к отдельным рендерингам. Я не упоминал об этом явно, так что это было плохо, но ваша идея определенно сработала бы иначе. Спасибо за вашу помощь. –

1

Я думаю, что проблема исходит от вашего TableModel (jtable.getModel()) Это где-то

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

сказал, но значение в вашей модели в этом столбце является строка

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

Да, это было - это очень помогло. Thanks :) –

0

Для отлаживая эту проблему, вам может потребоваться укусить пулю и поставить точку останова в строке JTable$BooleanRenderer.getTableCellRendererComponent() на линии, которая делает литье

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

(от JTable.java 1.288 06/11/15)

и проверить тип класса value. когда вы найдете String, вы можете определить столбец и строку с нарушением вашей модели. Это, по крайней мере, даст вам возможность определить проблему.

+0

Было очень полезно найти преступника, спасибо! –

0

Извините, что выкопал старый вопрос, но я столкнулся с этим вопросом & Это сообщение появилось в поиске, и это то, с чем я столкнулся.

У меня были тесты с ошибкой JUnits (и на самом деле бросали исключения во время выполнения), но я продолжал запускать add/remove на моем JTable (в тесте JUnit), который помещал приложение GUI в плохое состояние, и я бы увидел, что ClassCastException придет точно так же, как описал Крис.

Таким образом, «исправление» для меня состояло в том, чтобы убедиться в том, что все модульные тесты ловят их исключения и возвращают отказ вместо, чтобы продолжить больше модульных испытаний.

0

У меня была та же проблема, и причина была именно в том, что указал Авром.В моем случае, у меня была getValueAt реализована как:

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

Проблема здесь состоит в том, является строка не существует, возвращается строка, для каждого столбца. Однако некоторые из моих колонок имеет тип класса, Boolean, и, следовательно, исключение:

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) 

Решение было просто изменить возвращаемое значение:

return null;