2011-12-02 22 views
5

I कभी-कभी यह अपवाद प्राप्त करें। मैं वास्तव में नहीं जानता कि समस्या कहां है, मैं abstracttablemodel के कार्यान्वयन का उपयोग करता हूं। मैं उस उत्कृष्ट स्थान को प्राप्त करता हूं जहां अपवाद होता है, जब मैं डीबगर का उपयोग करता हूं और चरण अपवाद द्वारा चरणबद्ध नहीं होता है।जावा स्विंग: 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

यह तब हो सकता है जब आप इवेंट डिस्पैच थ्रेड के अलावा किसी अन्य थ्रेड से TableModel (या तालिका संरचना जिसे टेबलमोडेल "पर बैठता है) को संशोधित कर रहे हों।

इस त्रुटि का एक और आम कारण दृश्य और मॉडल सूचकांक को मिला रहा है। उदाहरण के लिए, यदि आप getSelectedRow() का उपयोग कर JTable से चयनित पंक्ति को पुनर्प्राप्त करते हैं तो मान दिया गया मान व्यू-आधारित इंडेक्स है। यदि आप संबंधित TableModel में अनुक्रमणित करना चाहते हैं तो आपको convertRowIndexToModel का उपयोग करके इस मान को परिवर्तित करने की आवश्यकता है।

बाद के मामले के लिए आप विभिन्न कॉलम पर तालिका को सॉर्ट करके और फिर विभिन्न पंक्तियों (विशेष रूप से पहले और आखिरी) पर क्लिक करके, या "यूआई" में जो भी कार्रवाई की आवश्यकता है, उसे करने के द्वारा इस अपवाद को दोहराने और दोहराने का प्रयास कर सकते हैं। वह पंक्ति

+0

के लिए धन्यवाद। मैं टेबल को सॉर्ट नहीं करता हूं और इंडेक्स को मिश्रित नहीं कर सकता, है ना? तो मुझे लगता है कि यह पहला मामला है। मैं यह समस्या कैसे हल करूं? 'SwingUtilities.invokeLater' को कॉल करके? अग्रिम में धन्यवाद। – bunnyjesse112

+1

यह सही है। आप हमेशा अपने मॉडल/यूआई को अपडेट करते समय उन स्थानों पर SwingUtilities.isEventDispatchThread() पर जोर दे सकते हैं। – Adamski

+0

मुझे लगता है कि मैं इस समस्या से छुटकारा पा लिया। आपकी मदद के लिए बहुत बहुत धन्यवाद, Adamski! आपने धमाल मचाया! – bunnyjesse112

3

सुनिश्चित करें कि आपके public int getRowCount() रिटर्न अपने वेक्टर के size()

+0

उत्तर के लिए धन्यवाद। यह सूची के आकार का आकार() करता है जो उत्तर के लिए धन्यवाद मॉडल मॉडल – bunnyjesse112