Java Swing:Jtable ArrayIndexOutOfBoundsException
我有时会遇到这种例外。我真的不知道问题出在哪里,我使用abstracttablemodel的实现。我找不到异常发生的地方,因为当我使用调试器并逐步运行时,不会发生异常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
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()。我想我已经解决了这个问题。非常感谢你的帮助,亚当斯基!你太棒了!