Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么线程中会出现异常;AWT-EventQueue-0“;java.lang.ArrayIndexOutofBounds异常:2?_Java_Swing_Exception_Concurrency_Event Dispatch Thread - Fatal编程技术网

为什么线程中会出现异常;AWT-EventQueue-0“;java.lang.ArrayIndexOutofBounds异常:2?

为什么线程中会出现异常;AWT-EventQueue-0“;java.lang.ArrayIndexOutofBounds异常:2?,java,swing,exception,concurrency,event-dispatch-thread,Java,Swing,Exception,Concurrency,Event Dispatch Thread,每次尝试更新JTable中的数据时,我都会遇到此错误: Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:501) at javax.swing.JTable.convertRowIndexToModel(JTable.java:

每次尝试更新JTable中的数据时,我都会遇到此错误:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2
at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:501)
at javax.swing.JTable.convertRowIndexToModel(JTable.java:2620)
at javax.swing.JTable.getValueAt(JTable.java:2695)
at javax.swing.JTable.prepareRenderer(JTable.java:5712)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2069)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1971)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1767)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
at javax.swing.JComponent.paintComponent(JComponent.java:751)
at javax.swing.JComponent.paint(JComponent.java:1017)
at javax.swing.JComponent.paintChildren(JComponent.java:852)
at javax.swing.JComponent.paint(JComponent.java:1026)
at javax.swing.JViewport.paint(JViewport.java:747)
at javax.swing.JComponent.paintChildren(JComponent.java:852)
at javax.swing.JComponent.paint(JComponent.java:1026)
at javax.swing.JComponent.paintChildren(JComponent.java:852)
at javax.swing.JComponent.paint(JComponent.java:1026)
at javax.swing.JComponent.paintChildren(JComponent.java:852)
at javax.swing.JComponent.paint(JComponent.java:1026)
at javax.swing.JComponent.paintChildren(JComponent.java:852)
at javax.swing.JComponent.paint(JComponent.java:1026)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5112)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
at javax.swing.RepaintManager.paint(RepaintManager.java:1220)
at javax.swing.JComponent._paintImmediately(JComponent.java:5060)
at javax.swing.JComponent.paintImmediately(JComponent.java:4870)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
数据似乎更新得很好,但有些地方出了问题,它甚至没有引用我的任何代码,这让我感到困扰。经过一段时间的调试,我确定是以下代码行导致了问题:

public class LoadingLogListThread extends Thread{

...

public void run() {

...
int colNo = rsmd.getColumnCount();

while(rs.next() ){
    Object[] objects = new Object[colNo];
    for(int i=0;i<colNo;i++){
        objects[i]=rs.getObject(i+1);
    }
    if( objects != null )
        aModel.addRow(objects);
    count++;
}

mainView.logEntryTable.setModel(aModel);
...

}
公共类加载LogListThread扩展线程{
...
公开募捐{
...
int colNo=rsmd.getColumnCount();
while(rs.next()){
Object[]objects=新对象[colNo];

对于(int i=0;i您需要在事件调度线程上更新模型。您可以生成一个新线程来执行某些工作,尤其是因为数据是从数据库中提取的。请尝试以下操作:

public class LoadingLogListThread extends Thread{

...

public void run() {

...
int colNo = rsmd.getColumnCount();

while(rs.next() ){
    Object[] objects = new Object[colNo];
    for(int i=0;i<colNo;i++){
        objects[i]=rs.getObject(i+1);
    }
    if( objects != null )
        aModel.addRow(objects);
    count++;
}

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        mainView.logEntryTable.setModel(aModel);
    }

});

...

}
公共类加载LogListThread扩展线程{
...
公开募捐{
...
int colNo=rsmd.getColumnCount();
while(rs.next()){
Object[]objects=新对象[colNo];

对于(int i=0;i如何更新表中的数据?请参阅上面更新代码的最后一行,了解我如何更新表中的数据。基本上,我只是将表的模型设置为新模型。1.更新表的方法很差。激发适当的事件。2.如果在非事件调度线程中设置表上的模型,则事件调度线程正在绘制,基础模型可能会更改,这可能会导致问题。您希望在事件调度线程中设置模型。请继续阅读,了解使用Swing Worker的解释和解决方案。哇,SwingWorker是关键…我刚刚更改了线程类,改为实现SwingWorker,瞧!谢谢大家。。。我本应该一辈子都在使用SwingWorker我现在尝试稍后使用invoke创建行,但我仍然得到异常。如果我稍后使用invoke,我将得到可复制的异常。对于我来说,我必须将RowsInserted更改为TableDataChanged。//fireTableRowsInserted(getRowCount()-1,getRowCount()-1);fireTableDataChanged();/*避免在默认行排序器中出现索引数组越界异常*/