Java Swing:Jtable ArrayIndexOutOfBoundsException

Java Swing:Jtable ArrayIndexOutOfBoundsException,java,swing,exception,jtable,Java,Swing,Exception,Jtable,我有时会遇到这种例外。我真的不知道问题出在哪里,我使用abstracttablemodel的实现。我找不到异常发生的地方,因为当我使用调试器并逐步运行时,不会发生异常 Exception occurred during event dispatching: java.lang.ArrayIndexOutOfBoundsException: 2 >= 2 at java.util.Vector.elementAt(Vector.java:427) at javax.s

我有时会遇到这种例外。我真的不知道问题出在哪里,我使用abstracttablemodel的实现。我找不到异常发生的地方,因为当我使用调试器并逐步运行时,不会发生异常

Exception occurred during event dispatching:
    java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
    at java.util.Vector.elementAt(Vector.java:427)
    at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277)
    at javax.swing.plaf.basic.BasicTableUI.paintGrid(BasicTableUI.java:1931)
    at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1767)
    at com.alee.laf.table.WebTableUI.paint(WebTableUI.java:52)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
    at javax.swing.JComponent.paintComponent(JComponent.java:752)
    at javax.swing.JComponent.paint(JComponent.java:1029)
    at javax.swing.JComponent.paintChildren(JComponent.java:862)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JViewport.paint(JViewport.java:747)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1225)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:786)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:694)
    at javax.swing.RepaintManager.access$700(RepaintManager.java:41)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1636)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)
    at java.awt.Dialog$1.run(Dialog.java:1046)
    at java.awt.Dialog$3.run(Dialog.java:1098)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Dialog.show(Dialog.java:1096)
    at java.awt.Component.show(Component.java:1584)
    at java.awt.Component.setVisible(Component.java:1536)
    at java.awt.Window.setVisible(Window.java:842)
    at java.awt.Dialog.setVisible(Dialog.java:986)
    at ui.MainFrame.queryButtonActionPerformed(MainFrame.java:936)
    at ui.MainFrame.access$700(MainFrame.java:89)
    at ui.MainFrame$9.actionPerformed(MainFrame.java:538)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
    at java.awt.Component.processMouseEvent(Component.java:6288)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6053)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4651)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:616)
    at java.awt.EventQueue$2.run(EventQueue.java:614)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
    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)
我的桌子型号:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import entity3.Document;
import entity3.Msg;
import entity3.Senderreceiver;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author work
 */
public class IncomingMailTableModel extends AbstractTableModel{
    public String[] getColumnNames() {
        return columnNames;
    }

    public void setColumnNames(String[] columnNames) {
        this.columnNames = columnNames;
    }
    private String[] columnNames = {"Дата",
        "Тема",
        "Відправник",
        "Статус"};

    private List<Document> documents;

    public IncomingMailTableModel(List<Document> documents) {
        this.documents = documents;
    }

    @Override
    public int getRowCount() {
        return documents.size();
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Document getObjectAtRow(int row) {     
        return documents.get(row);  
    }
    @Override
    public Class getColumnClass(int column) {
        switch (column) {
            case 0:
                return String.class;
            case 1:
                return String.class; 
            case 2:
                return String.class;
            case 3:
                return String.class;

        }
        return null;
    }

    @Override
    public String getValueAt(int row, int column) {
        String toReturn = "";
        Document document = documents.get(row);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Msg msg =document.getMsg();
        ArrayList<Senderreceiver> senderReceivers = new ArrayList<Senderreceiver>(msg.getSenderreceivers());
        //ArrayList<Document> docs = new ArrayList<Document>(document.getMsg().getDocuments());
        switch (column) {
            case 0:
                if (document.getMsg().getReceivingDate() != null) 
                    toReturn = format.format(document.getMsg().getReceivingDate());

                break;
            case 1:
                toReturn = document.getTitle();

                break;

            case 2:
                for (Object o : senderReceivers) {
                    Senderreceiver senderReceiver = (Senderreceiver) o;
                    if (senderReceiver.getRole()==0) {
                        toReturn = senderReceiver.getOrganization().getShortName();
                    }
                }
                break;
            case 3:
                if (document.getMsg().getIsRead()!=null)
                if(document.getMsg().getIsRead()) toReturn = "Прочитано";
                else toReturn="Непрочитано";
                break;
        }
        return toReturn;
    }
}
/*
*要更改此模板,请选择工具|模板
*然后在编辑器中打开模板。
*/
包util;
进口实体3.文件;
进口实体3.Msg;
进口实体3.发送方接收方;
导入java.text.simpleDataFormat;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.table.AbstractTableModel;
/**
*
*@作者作品
*/
公共类IncomingMailTableModel扩展了AbstractTableModel{
公共字符串[]getColumnNames(){
返回列名称;
}
public void setColumnNames(字符串[]columnNames){
this.columnNames=columnNames;
}
私有字符串[]columnNames={“ааааa”,
"Тема",
"Відправник",
"Статус"};
私人清单文件;
公共收入邮件表模型(列表文档){
本文件=文件;
}
@凌驾
public int getRowCount(){
返回文档。大小();
}
@凌驾
public int getColumnCount(){
返回columnNames.length;
}
@凌驾
公共字符串getColumnName(int-col){
返回列名[col];
}
公共文档getObjectAtRow(int行){
返回文档。获取(行);
}
@凌驾
公共类getColumnClass(int列){
开关(列){
案例0:
返回字符串.class;
案例1:
返回字符串.class;
案例2:
返回字符串.class;
案例3:
返回字符串.class;
}
返回null;
}
@凌驾
公共字符串getValueAt(int行,int列){
字符串toReturn=“”;
文档=documents.get(行);
SimpleDateFormat=新的SimpleDateFormat(“yyyy-MM-dd”);
Msg=document.getMsg();
ArrayList SenderReceiver=新的ArrayList(msg.getSenderReceiver());
//ArrayList docs=新的ArrayList(document.getMsg().getDocuments());
开关(列){
案例0:
if(document.getMsg().getReceivingDate()!=null)
toReturn=format.format(document.getMsg().getReceivingDate());
打破
案例1:
toReturn=document.getTitle();
打破
案例2:
对于(对象o:发送方接收方){
Senderreceiver Senderreceiver=(Senderreceiver)o;
if(senderReceiver.getRole()==0){
toReturn=senderReceiver.getOrganization().getShortName();
}
}
打破
案例3:
if(document.getMsg().getIsRead()!=null)
如果(document.getMsg().getIsRead())返回;
else toReturn=“ччаааа”;
打破
}
回归回归;
}
}

确保您的
public int getRowCount()
返回向量的
size()

如果您从事件调度线程以外的线程修改
TableModel
(或TableModel“所在”的数据结构),则可能会发生这种情况

此错误的另一个常见原因是混淆了视图索引和模型索引。例如,如果使用
getSelectedRow()
JTable
检索所选行,则返回的值是基于视图的索引。如果希望索引到相应的
表格模型
,则需要使用转换此值


对于后一种情况,您可以尝试复制此异常,方法是将表排序到不同的列上,然后单击不同的行(特别是第一行和最后一行),或者执行UI中需要的任何操作以“处理”那一行。

你能提供一些代码来说明你在哪里得到了这个异常吗?你是从另一个线程中添加/删除表中的列吗?我为我的tablemodel添加了代码。谢谢你的回答。它确实返回了列表的size(),该列表被delagated到表model。谢谢您的回答。我不会对表进行排序,这样模型索引和视图索引就不会混淆,对吗?所以我认为这是第一例。如何解决此问题?通过调用'SwingUtilities.invokeLater'?提前谢谢,没错。您可以在更新模型/UI的地方始终声明SwingUtilities.isEventDispatchThread()。我想我已经解决了这个问题。非常感谢你的帮助,亚当斯基!你太棒了!