Java 动态更改JTable中的列数

Java 动态更改JTable中的列数,java,jtable,abstracttablemodel,Java,Jtable,Abstracttablemodel,我有一个JTable和一个TableModel扩展了AbstractTableModel。我想动态设置表中的列数。我通过向名为column\u count的TableModel添加一个属性,并让getcolumn\u count返回column\u count来实现这一点。我还添加了一个方法,setColumnCount,该方法设置column\u count,并调用fireTableStructureChanged。不幸的是,当我运行该程序时,我不断得到ArrayIndexOutOfBound

我有一个
JTable
和一个
TableModel
扩展了
AbstractTableModel
。我想动态设置表中的列数。我通过向名为
column\u count
TableModel
添加一个属性,并让
getcolumn\u count
返回
column\u count
来实现这一点。我还添加了一个方法,
setColumnCount
,该方法设置
column\u count
,并调用
fireTableStructureChanged
。不幸的是,当我运行该程序时,我不断得到
ArrayIndexOutOfBounds
异常。谁能告诉我我做错了什么,或者提出更好的解决方案

这里有一个堆栈跟踪:
线程“AWT-EventQueue-0”java.lang.ArrayIndexOutOfBoundsException中的异常:4>=4 位于java.util.Vector.elementAt(未知源) 位于javax.swing.table.DefaultTableColumnModel.getColumn(未知源) 位于javax.swing.plaf.basic.BasicTableUI.paintGrid(未知源代码) 位于javax.swing.plaf.basic.BasicTableUI.paint(未知源代码) 位于javax.swing.plaf.ComponentUI.update(未知源代码) 位于javax.swing.JComponent.paintComponent(未知源) 位于javax.swing.JComponent.paint(未知源代码) 位于javax.swing.JComponent.paintooffscreen(未知源) 位于javax.swing.repainmanager$PaintManager.paintDoubleBuffered(未知源) 位于javax.swing.repainmanager$PaintManager.paint(未知源) 位于javax.swing.RepaintManager.paint(未知源) javax.swing.JComponent.\u(未知源) 位于javax.swing.JComponent.paintInstance(未知源代码) 位于javax.swing.repainmanager.paintDirtyRegions(未知源) 位于javax.swing.repainmanager.paintDirtyRegions(未知源) 位于javax.swing.repainmanager.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(未知源)

您的
getValueAt()
方法在哪里获取数据?如果它是一个ArrayList,并且您增加了列大小,那么该表将尝试从列表中获取该列并引发异常


如果这不是问题,请使用DefaultTableModel和添加列,或者确保从事件分派线程对表模型进行任何更改。

您的
getValueAt()方法从哪里获取数据?如果它是一个ArrayList,并且您增加了列大小,那么该表将尝试从列表中获取该列并引发异常


如果这不是问题所在,请使用DefaultTableModel和添加列,或者确保从事件分派线程对表模型进行任何更改。

我认为异常的原因如下:

  • 将内部列计数设置为+1
  • 您导致触发事件,这将导致表以可视方式更新
  • 当JTable更新代码访问最后一列时,列模型中的内部向量抛出异常
  • 原因可能是DefaultTableColumnModel的底层代码不知道新列,并且它的向量没有被正确更改


    要解决此问题,您可能需要编写自己的自定义TableColumnModel,该模型可以正确处理更改的维度。

    我认为导致异常的原因如下:

  • 将内部列计数设置为+1
  • 您导致触发事件,这将导致表以可视方式更新
  • 当JTable更新代码访问最后一列时,列模型中的内部向量抛出异常
  • 原因可能是DefaultTableColumnModel的底层代码不知道新列,并且它的向量没有被正确更改


    要解决此问题,您可能需要编写自己的自定义TableColumnModel,它可以正确处理更改的维度。

    调用
    JTable的方法
    setModel(tm)
    ,使用更改的
    TableModel

    在我的案例中解决了一个类似的错误。

    调用
    JTable
    的方法
    setModel(tm)
    ,使用tm更改
    TableModel

    在我的例子中解决了一个类似的错误。

    也许您可以添加一些代码让我们看看?是什么方法为您提供ArrayIndexOutOfBounds?是否可以打印堆栈跟踪?是否可以扩展
    DefaultTableModel
    ?它已经有了
    addColumn
    方法。@Dan:什么样的代码会有帮助?我不想为张贴一堵文字墙而打扰别人。@khachik,我想我可以,但我通常更喜欢使用
    AbstractTableModel
    ,而这不是更大内容的一部分,这是为了使程序能够处理动态列计数。也许您可以添加一些代码让我们看看?是什么方法为您提供了ArrayIndexOutOfBounds?是否可以打印堆栈跟踪?是否可以扩展
    DefaultTableModel
    ?它已经有了
    addColumn
    方法。@Dan:什么样的代码会有帮助?我不想为张贴一堵文字墙而打扰别人。@khachik,我想我可以,但我通常更喜欢使用
    AbstractTableModel
    ,而这并不是更大内容的一部分,其目的是使程序能够处理动态列计数。
    getValueAt()
    使用公式
    (arg0+1)*arg1
    我没有直接干扰事件调度线程。我的测试应用程序所做的就是c