2011-12-02 13 views
5

I a veces obtener esta excepción. Realmente no sé dónde hay problema, uso mi implementación de abstracttablemodel. NO PUEDO encontrar el lugar donde se produce la excepción, porque cuando uso depurador y ejecuto la excepción paso a paso no ocurre.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) 

mi modelo de tabla:

/* 
* 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

¿Puede proporcionarnos algún código para obtener esta excepción? – gprathour

+1

muestra tu código! – Jonas

+1

¿Está agregando/eliminando columnas en su tabla de otro hilo? –

Respuesta

11

Esto puede ocurrir si está modificando el TableModel (o la estructura de datos en la que TableModel "se asienta") desde un subproceso que no sea el subproceso Event Dispatch.

Otra causa común de este error es mezclar los índices de vista y modelo. Por ejemplo, si recupera la fila seleccionada de JTable utilizando getSelectedRow(), el valor devuelto es un índice basado en vista. Si desea indexar en el correspondiente TableModel, necesita convertir este valor usando convertRowIndexToModel.

Para este último caso, puede intentar y replicar esta excepción clasificando la tabla en diferentes columnas y haciendo clic en varias filas (en particular, la primera y la última) o realizando las acciones necesarias en su UI para "procesar" esa fila

+0

gracias por la respuesta. No clasifico la tabla para que los índices de modelos y vistas no se mezclen, ¿verdad? Entonces creo que es el primer caso. ¿Cómo soluciono este problema? Llamando a 'SwingUtilities.invokeLater'? Gracias por adelantado. – bunnyjesse112

+1

Eso es correcto. Siempre puede afirmar SwingUtilities.isEventDispatchThread() en los lugares donde actualiza su modelo/UI. – Adamski

+0

Creo que me deshice de este problema. ¡Muchas gracias por su ayuda, Adamski! ¡Rock! – bunnyjesse112

3

Asegúrese de que sus public int getRowCount() devuelve el size() de su vector.

+0

gracias por la respuesta. devuelve el tamaño() de la Lista que se desglosa en el modelo de tabla – bunnyjesse112