我在JTable上使用自定义模型应用了两个操作。
首先是过滤操作:
// rf is a RowFilter object
((DefaultRowSorter) table.getRowSorter()).setRowFilter(rf);
此后,另一个线程更改表列名并触发事件:
model.fireTableChanged(new TableModelEvent(model, TableModelEvent.HEADER_ROW));
但是,抛出了一个运行时异常。可能的原因是什么?
跟踪如下。感谢。
线程中的异常" AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException:-1 at java.util.Vector.elementData(Vector.java:734)at java.util.Vector.elementAt(Vector.java:477)at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294) 在 com.jtattoo.plaf.BaseTableHeaderUI.getHeaderRenderer(BaseTableHeaderUI.java:189) 在 com.jtattoo.plaf.BaseTableHeaderUI.paintCell(BaseTableHeaderUI.java:358) 在 com.jtattoo.plaf.BaseTableHeaderUI.paint(BaseTableHeaderUI.java:327) 在javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)at javax.swing.JComponent.paintComponent(JComponent.java:780)at javax.swing.JComponent.paint(JComponent.java:1056)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JViewport.paint(JViewport.java:728)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)at at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintChildren(JComponent.java:889)at javax.swing.JComponent.paint(JComponent.java:1065)at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210)at javax.swing.RepaintManager中的$ PaintManager.paintDoubleBuffered(RepaintManager.java:1579) 在 javax.swing.RepaintManager中的$ PaintManager.paint(RepaintManager.java:1502) 在javax.swing.RepaintManager.paint(RepaintManager.java:1272)at javax.swing.JComponent._paintImmediately(JComponent.java:5158)at at javax.swing.JComponent.paintImmediately(JComponent.java:4969)at javax.swing.RepaintManager $ 4.run(RepaintManager.java:831)at javax.swing.RepaintManager $ 4.run(RepaintManager.java:814)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 在 javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) 在 javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789) 在 javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738) 在javax.swing.RepaintManager.access $ 1200(RepaintManager.java:64)at javax.swing.RepaintManager中的$ ProcessingRunnable.run(RepaintManager.java:1732) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 在java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)at java.awt.EventQueue.access $ 500(EventQueue.java:97)at java.awt.EventQueue $ 3.run(EventQueue.java:709)at java.awt.EventQueue $ 3.run(EventQueue.java:703)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
答案 0 :(得分:0)
看看你的堆栈跟踪,我猜是BaseTableHeaderUI中的一个错误
com.jtattoo.plaf.BaseTableHeaderUI.getHeaderRenderer(BaseTableHeaderUI.java:189)
因为上面是对javax.swing.table.DefaultTableColumnModel的调用:
/**
* Returns the <code>TableColumn</code> object for the column
* at <code>columnIndex</code>.
*
* @param columnIndex the index of the column desired
* @return the <code>TableColumn</code> object for the column
* at <code>columnIndex</code>
*/
public TableColumn getColumn(int columnIndex) {
return tableColumns.elementAt(columnIndex);
}
看起来BaseTableHeaderUI与您的两个线程有问题。 那么也许你应该在同一个线程中处理所有事件?我的选择是Event-Dipatch-Thread。