我在界面上采用了JTable;用JList来显示我线程中的运行状况.我将Jlist放在JScrolPane容器中.编译和运行均未出现错误.而运行一段时间后,随机会出现以下异常.我想请问这是怎么回事情?
异常1:
java.lang.ArrayIndexOutOfBoundsException: 374
at javax.swing.plaf.basic.BasicListUI.updateLayoutState(BasicListUI.java:1155)
at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1098)
at javax.swing.plaf.basic.BasicListUI.getPreferredSize(BasicListUI.java:281)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1275)
at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
at java.awt.Container.layout(Container.java:1020)
at java.awt.Container.doLayout(Container.java:1010)
at java.awt.Container.validateTree(Container.java:1092)
at java.awt.Container.validate(Container.java:1067)
at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:353)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:116)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
异常2:
java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
at java.util.Vector.elementAt(Vector.java:431)
at javax.swing.DefaultListModel.getElementAt(DefaultListModel.java:70)
at javax.swing.plaf.basic.BasicListUI.paintCell(BasicListUI.java:122)
at javax.swing.plaf.basic.BasicListUI.paint(BasicListUI.java:215)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
at javax.swing.JComponent.paintComponent(JComponent.java:541)
at javax.swing.JComponent.paint(JComponent.java:808)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JViewport.paint(JViewport.java:722)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4787)
at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4740)
at javax.swing.JComponent._paintImmediately(JComponent.java:4685)
at javax.swing.JComponent.paintImmediately(JComponent.java:4488)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:410)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:117)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

解决方案 »

  1.   

    运行中你的JList的size小于你指定引用的index了。例如:JList里有10行数据,你要求取出第11行的。
      

  2.   

    越界了
    比如size()=20的,最大下标只有19,就是0到size-1
      

  3.   

    JLIST的size小于你指定引用的index
    越界了
      

  4.   

    java.lang.ArrayIndexOutOfBoundsException  数组下标越界
      

  5.   

    我本人觉得,这个问题主要是界面刷新线程和Model内容更新频率不一致所引起.目前我还没有多少时间来解决这个.哪个兄弟帮我查找一下.
      

  6.   

    chulj(chulj)说的不错,我也遇到过同样的问题,我的解决方法是给model一个默认值,然后catch异常,用默认值填充list
      

  7.   

    默认情况下,JList一屏显示几十条数据吧,因此你的问题很可能是你没有设置JList可以显示的数据条数,导致了显示的内容大于一屏幕能够显示的条数。你可以把JList一屏幕显示的记录值设置大一点试试。
    JList list= new JList(new DefaultListModel());
    list.setVisibleRowCount(100);
      

  8.   

    这个问题,我已经解决,解决的办法就是重载了DefaultListModel的方法getElementAt(int index),当JScrolPanel刷新界面的时候,去获取JList中的元素.结果由于刷新频率没有增加数据的频率高,导致在某个index的数据时,JList的元素已经清除过一次,出现了错.
    public class RunInfoListModel extends DefaultListModel {
          public synchronized Object getElementAt(int index) {
    int  iSize = getSize()-1;
    if(index>=iSize){
    index=iSize;
    }
    return elementAt(index);
    }
      ////增加一个显示要素
    public synchronized void add(String runInfo) {
    String sTemp = "";
    DateFormat formatter = DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA);

    sTemp = formatter.format(new Date());
    int iSize = getSize();
    if(iSize>30) {
    clear();
    addElement(sTemp +  "    "  + runInfo);
    fireContentsChanged(sTemp,0,1);
    }else{
    addElement(sTemp +  "    "  + runInfo);
    }

    }     
    }