Java &引用;fireTableChanged“;JTable模型上的事件在筛选后引发异常
我使用自定义模型对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)); 但是,正在引发运行时异常。可能的原因是什么 下面给出了跟
// 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