0

我目前正在重构JTable显示多种不同类型数据的 a 。这种重构的主要原因是有一些ClassCastExceptions(编写代码的作者/朋友暂停了),我似乎无法找到它们的来源。由于代码库很大,我不知道从哪里开始。有没有人有什么建议?我意识到这个问题的模棱两可并道歉!

我在下面包含了堆栈跟踪。谢谢!!

线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException:java.lang.String 无法转换为 java.lang.Boolean
    在 javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(未知来源)
    在 javax.swing.JTable.prepareRenderer(未知来源)
    在 javax.swing.plaf.basic.BasicTableUI.paintCell(未知来源)
    在 javax.swing.plaf.basic.BasicTableUI.paintCells(未知来源)
    在 javax.swing.plaf.basic.BasicTableUI.paint(未知来源)
    在 javax.swing.plaf.ComponentUI.update(未知来源)
    在 javax.swing.JComponent.paintComponent(未知来源)
    在 javax.swing.JComponent.paint(未知来源)
    在 javax.swing.JComponent.paintToOffscreen(未知来源)
    在 javax.swing.BufferStrategyPaintManager.paint(未知来源)
    在 javax.swing.RepaintManager.paint(未知来源)
    在 javax.swing.JComponent._paintImmediately(未知来源)
    在 javax.swing.JComponent.paintImmediately(未知来源)
    在 javax.swing.RepaintManager.paintDirtyRegions(未知来源)
    在 javax.swing.RepaintManager.paintDirtyRegions(未知来源)
    在 javax.swing.RepaintManager.seqPaintDirtyRegions(未知来源)
    在 javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(未知来源)
    在 java.awt.event.InvocationEvent.dispatch(未知来源)
    在 java.awt.EventQueue.dispatchEvent(未知来源)
    在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源)
    在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源)
    在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源)
    在 java.awt.EventDispatchThread.pumpEvents(未知来源)
    在 java.awt.EventDispatchThread.pumpEvents(未知来源)
    在 java.awt.EventDispatchThread.run(未知来源)
4

6 回答 6

3

发生的这个错误BooleanRenderer是因为它期望来自表模型的值是类型Boolean并尝试转换为它(akf 的答案具有它发生的确切代码行)。

我的猜测是,最初预计模型会返回Boolean给定列的值,但有一次它会返回字符串。因此,我将专注于这个给定表使用的模型(它是自定义模型吗?它是向其添加值的默认模型吗?)并查看它可能在哪里获得 String 而不是Boolean.

于 2009-06-11T19:07:34.430 回答
2

可能该表包含一个复选框(当列模型声明该列包含布尔类型时)并且渲染器尝试将内容转换为布尔值。但可能内容只是字符串。解决方案是更改表中的数据或创建自己的渲染器。

于 2009-06-10T21:21:05.523 回答
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);
      }
  }
于 2009-06-10T21:21:40.810 回答
0

我遇到了同样的问题,原因与 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
  }
}

这里的问题是,一行不存在,每列都返回一个字符串。但是,我的某些列具有类类型 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;
于 2014-03-10T22:48:09.240 回答
0

要调试此问题,您可能需要考虑硬着头皮在进行强制转换JTable$BooleanRenderer.getTableCellRendererComponent() 的行中放置一个断点

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

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

并检查value. 当您找到 a 时String,您可以从模型中识别出有问题的列和行。这至少会让你开始识别问题。

于 2009-06-10T21:43:51.233 回答
0

很抱歉挖掘了一个老问题,但我自己也遇到了这个问题,这篇文章是在搜索中出现的,这就是我遇到的。

我让 JUnits 测试失败(并且实际上引发了运行时异常),但我继续在我的 JTable 上运行 add/removes(在 JUnit 测试中),这使 GUI 应用程序处于错误状态,我会看到 ClassCastException 与 Chris 完全一样曾描述过。

所以对我来说,“修复”是确保所有单元测试都能捕获它们的异常并返回失败,而不是继续运行更多的单元测试。

于 2010-10-12T17:32:44.000 回答