我当前重构而显示不同类型的数据的多个一JTable。对于这个重构的主要理由是,有几个ClassCastExceptions(撰文/朋友,谁写的代码是关闭的反响平平),我似乎无法找到这些地方都源自。由于大量的代码库,我在茫然,从哪里开始。有没有人有什么建议?我知道和这个问题的不确定性道歉!

我已经包括下面的堆栈跟踪。谢谢!

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)
有帮助吗?

解决方案

这是在BooleanRenderer发生该错误是因为它期待其是从表的模型的值是类型Boolean的,并试图投射到它(AKF的回答具有在那里发生的准确代码行)。

我的猜测是,它最初预计,该模型将返回Boolean值定列,但在一个点它,而不是返回字符串。 因此,我会集中于正在使用什么型号为这个给定的表(它是一个自定义的模式?是不是在那里添加值给它的默认模式?),看看它可以得到一个字符串,而不是一个Boolean的。

其他提示

也许表包含一个复选框(当列模型指出列包含布尔类型)和渲染器试图将内容转换为一个布尔值。但大概内容是只是字符串。该解决方案是改变数据表或创建自己的渲染器。

我认为这个问题来自于您的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);
      }
  }

要调试这个问题,你可能要考虑咬咬牙,把一个断点在JTable$BooleanRenderer.getTableCellRendererComponent()上,使得投行

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

(来自JTable.java 1.288 06/11/15

和检查类型value的。当你发现一个String,你可以从你的模型识别出错的行和列。这将至少给你确定问题开始。

不好意思挖了一个老问题,但我遇到了这个问题,我自己和这个帖子在搜索过来了,这是我碰上了。

我有JUnits测试失败(实际上是抛出运行时异常),但我继续跑加上我的JTable /删除(在JUnit测试),它把GUI应用程序在一个糟糕的状态,我会看到ClassCastException异常上来完全一样克里斯说明。

所以,“修正”对我来说,以确保所有的单元测试吸引他们的异常,并返回程序的故障的而不是运行更多的单元测试。

我有同样的问题,并且原因是完全相同Avrom指定。在我的情况下,我有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
  }
}

这里的问题是,为行不存在,一个字符串被返回,对于每一个列。但是我的一些列的具有类类型,布尔型,并且因此异常:

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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top