2011-12-02 77 views
5

有時得到這個例外。我真的不知道問題在哪裏,我使用了我的abstracttablemodel實現。我找到了異常發生的地方,因爲當我使用調試器和運行一步一步異常不會發生。的Java Swing:JTable中ArrayIndexOutOfBoundsException異常

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; 
    } 
} 
+2

你能提供一些代碼,你得到這個異常? – gprathour

+1

顯示你的代碼! – Jonas

+1

你是否從另一個線程添加/刪除表中的列? –

回答

11

如果您從Event Dispatch線程以外的線程修改TableModel(或TableModel「位於的數據結構」),則可能發生這種情況。

此錯誤的另一個常見的原因是混合起來視圖和模型索引。例如,如果您檢索從JTable使用getSelectedRow()選定行返回的值是基於視圖指數。如果您想索引相應的TableModel,則需要使用convertRowIndexToModel轉換此值。

對於後一種情況,您可以嘗試通過對不同列進行排序然後單擊各行(特別是第一個和最後一個)或者在UI中執行任何需要的操作來複制此異常,以便「處理」那一排。

+0

感謝您的答案。我不排序表,所以模型和視圖索引不能混在一起,對吧?所以我認爲它是第一個案例。我如何解決這個問題?通過調用'SwingUtilities.invokeLater'?提前致謝。 – bunnyjesse112

+1

沒錯。您可以在更新模型/ UI的地方始終聲明SwingUtilities.isEventDispatchThread()。 – Adamski

+0

我想我擺脫了這個問題。非常感謝你的幫助,Adamski!你搖滾! – bunnyjesse112

3

確保您public int getRowCount()回報您的載體的size()

+0

謝謝你的回答。它會返回列表的大小(),這是覆蓋表模型 – bunnyjesse112

相關問題