【发布时间】:2011-08-21 10:05:57
【问题描述】:
所以我基本上是在每次击键时或当观察者有更新时尝试刷新我的 JTable。有时我得到的是一个冻结的应用程序和这个堆栈跟踪......
线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 5 >= 5 在 java.util.Vector.elementAt(未知来源) 在 javax.swing.table.DefaultTableColumnModel.getColumn(未知来源) 在 javax.swing.plaf.synth.SynthTableUI.paintCells(未知来源) 在 javax.swing.plaf.synth.SynthTableUI.paint(未知来源) 在 javax.swing.plaf.synth.SynthTableUI.update(未知来源) 在 javax.swing.JComponent.paintComponent(未知来源) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintToOffscreen(未知来源) 在 javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(未知来源) 在 javax.swing.RepaintManager$PaintManager.paint(未知来源) 在 javax.swing.RepaintManager.paint(未知来源) 在 javax.swing.JComponent._paintImmediately(未知来源) 在 javax.swing.JComponent.paintImmediately(未知来源) 在 javax.swing.RepaintManager.paintDirtyRegions(未知来源) 在 javax.swing.RepaintManager.paintDirtyRegions(未知来源) 在 javax.swing.RepaintManager.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(未知来源) 线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 4 >= 4 在 java.util.Vector.elementAt(未知来源) 在 javax.swing.table.DefaultTableColumnModel.getColumn(未知来源) 在 sun.swing.SwingUtilities2.convertColumnIndexToModel(未知来源) 在 javax.swing.JTable.convertColumnIndexToModel(未知来源) 在 javax.swing.JTable.getColumnClass(未知来源) 在 javax.swing.plaf.synth.SynthTableUI$SynthTableCellRenderer.getTableCellRendererComponent(未知来源) 在 javax.swing.JTable.prepareRenderer(未知来源) 在 javax.swing.plaf.synth.SynthTableUI.paintCell(未知来源) 在 javax.swing.plaf.synth.SynthTableUI.paintCells(未知来源) 在 javax.swing.plaf.synth.SynthTableUI.paint(未知来源) 在 javax.swing.plaf.synth.SynthTableUI.update(未知来源) 在 javax.swing.JComponent.paintComponent(未知来源) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintToOffscreen(未知来源) 在 javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(未知来源) 在 javax.swing.RepaintManager$PaintManager.paint(未知来源) 在 javax.swing.RepaintManager.paint(未知来源) 在 javax.swing.JComponent._paintImmediately(未知来源) 在 javax.swing.JComponent.paintImmediately(未知来源) 在 javax.swing.RepaintManager.paintDirtyRegions(未知来源) 在 javax.swing.RepaintManager.paintDirtyRegions(未知来源) 在 javax.swing.RepaintManager.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(未知来源)
如果有帮助,这是我刷新表格的代码:
public synchronized void refreshTable()
{
Customer cust = custManager.getCustomer(phoneNumber.getText());
if (cust == null)
{
table.setModel(new DefaultTableModel(new Object[][] {}, tableHeader) {
@SuppressWarnings("rawtypes")
Class[] columnTypes = new Class[] {Integer.class, String.class,
Object.class, Object.class,
Object.class, Object.class};
@SuppressWarnings({ "unchecked", "rawtypes" })
public Class getColumnClass(int columnIndex) {
return columnTypes[columnIndex];
}
public boolean isCellEditable(int row, int column) {
return false;
}
});
table.getColumnModel().getColumn(0).setPreferredWidth(40);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
return;
}
Object[][] grid = new Object[cust.getOrderHistory().size()][6];
SimpleDateFormat sdf = new SimpleDateFormat("MMM/dd/yyyy HH:mm");
NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
int i = 0;
for (Entry<GregorianCalendar, Order> orderEntry : cust.getOrderHistory())
{
Order order = orderEntry.getValue();
grid[i][0] = order.getOrderID();
grid[i][1] = sdf.format((order.getProcessedTimestamp().getTime()));
grid[i][2] = currencyFormat.format(order.getSubTotal()/100.00);
grid[i][3] = currencyFormat.format(order.getTaxedAmount()/100.00);
grid[i][4] = currencyFormat.format(order.getTotal()/100.00);
grid[i][5] = order.getOrderStatus();
i++;
}
DefaultTableModel dft = new DefaultTableModel(grid, tableHeader) {
@SuppressWarnings("rawtypes")
Class[] columnTypes = new Class[] {Integer.class, String.class,
Object.class, Object.class,
Object.class, Object.class};
@SuppressWarnings({ "unchecked", "rawtypes" })
public Class getColumnClass(int columnIndex) {
return columnTypes[columnIndex];
}
public boolean isCellEditable(int row, int column) {
return false;
}
};
table.setModel(dft);
table.getColumnModel().getColumn(0).setPreferredWidth(40);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
}
为了记录,我已经尝试将它包装在 try/catch 中,但没有帮助。我也尝试过更改默认异常处理程序,但也没有成功。
【问题讨论】:
-
只有在您快速输入时才会出现这种情况吗?也就是说,如果您一次小心地按一个键,它的行为是否符合您的预期?还是不管输入速度如何都会出现问题?
-
当我快速输入时确实发生了这种情况,并且当实例接收到“更新”调用时确实发生了。我倾向于同意这是一种竞争条件,但这只是一个奇怪的条件。
标签: java multithreading swing exception jtable