" fireTableChanged"过滤

时间:2016-10-07 08:43:25

标签: 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));

但是,抛出了一个运行时异常。可能的原因是什么?

跟踪如下。感谢。

  

线程中的异常" 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)

1 个答案:

答案 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。