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