Java &引用;fireTableChanged“;JTable模型上的事件在筛选后引发异常

Java &引用;fireTableChanged“;JTable模型上的事件在筛选后引发异常,java,swing,jtable,thread-safety,filtering,Java,Swing,Jtable,Thread Safety,Filtering,我使用自定义模型对JTable应用了两个操作 首先是过滤操作: // rf is a RowFilter object ((DefaultRowSorter) table.getRowSorter()).setRowFilter(rf); 此后,另一个线程更改表列名并触发事件: model.fireTableChanged(new TableModelEvent(model, TableModelEvent.HEADER_ROW)); 但是,正在引发运行时异常。可能的原因是什么 下面给出了跟

我使用自定义模型对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位于 java.util.Vector.elementData(Vector.java:734)位于 java.util.Vector.elementAt(Vector.java:477)位于 javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294) 在 com.jattoo.plaf.BaseTableHeaderUI.getHeaderRenderer(BaseTableHeaderUI.java:189) 在 paintCell(BaseTableHeaderUI.java:358) 在 paint(BaseTableHeaderUI.java:327) 位于javax.swing.plaf.ComponentUI.update(ComponentUI.java:161) javax.swing.JComponent.paintComponent(JComponent.java:780)位于 javax.swing.JComponent.paint(JComponent.java:1056)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JViewport.paint(JViewport.java:728)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JLayeredPane.paint(JLayeredPane.java:586)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintChildren(JComponent.java:889)位于 javax.swing.JComponent.paint(JComponent.java:1065)位于 javax.swing.JComponent.paintooffscreen(JComponent.java:5210)位于 repaitmanager$PaintManager.paintDoubleBuffered(repaitmanager.java:1579) 在 repaitmanager$PaintManager.paint(repaitmanager.java:1502) 在javax.swing.repaitmanager.paint(repaitmanager.java:1272)中 JComponent(JComponent.java:5158)位于 javax.swing.JComponent.paintInstance(JComponent.java:4969)位于 repaitmanager$4.run(repaitmanager.java:831) repaitmanager$4.run(repaitmanager.java:814) java.security.AccessController.doPrivileged(本机方法)位于 ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 在 javax.swing.repaitmanager.paintDirtyRegions(repaitmanager.java:814) 在 javax.swing.repaitmanager.paintDirtyRegions(repaitmanager.java:789) 在 prePaintDirtyRegions(RepaintManager.java:738) 在javax.swing.repaitmanager.access$1200(repaitmanager.java:64) repaitmanager$ProcessingRunnable.run(repaitmanager.java:1732) 在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)中 位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 访问$500(EventQueue.java:97) java.awt.EventQueue$3.run(EventQueue.java:709)在 java.awt.EventQueue$3.run(EventQueue.java:703)在 java.security.AccessController.doPrivileged(本机方法)位于 ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)


看看你的stacktrace我猜BaseTableHeaderUI中有个bug

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与您的两个线程有问题。
所以也许你应该在同一个线程中处理所有事件?我的选择是事件Dipatch线程。

方法
com.jttoo.plaf.BaseTableHeaderUI.getHeaderRenderer
调用
DefaultTableColumnModel.getColumn(-1)
,但该方法不起作用。你和你的任何一个班级都参与了这个stacktrace吗?“当使用分拣机时,请记住翻译单元格坐标。”-。@f1sh不,我没有参与。但是,我在EDT中调用了
fireTableChanged
。@trashgood在过滤后,我没有显式地尝试按索引获取任何行。下面的唯一操作是重命名列标题并在模型上触发模型更改事件。谢谢。我不明白你说的“两条线”是什么意思<代码>fireModelChang