Java Swing Basicu更新错误,我能做什么?

Java Swing Basicu更新错误,我能做什么?,java,multithreading,swing,swingworker,Java,Multithreading,Swing,Swingworker,我的程序使用Swing JPanel、JList、JScrollPane 它运行正常,但生成了以下错误消息,但在消息中它没有说明是我的程序的哪一行导致了错误,我该怎么办 ========================================================================= Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3

我的程序使用Swing JPanel、JList、JScrollPane

它运行正常,但生成了以下错误消息,但在消息中它没有说明是我的程序的哪一行导致了错误,我该怎么办

=========================================================================

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3

        at javax.swing.plaf.basic.BasicListUI.updateLayoutState(BasicListUI.java:1356)
        at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1299)
        at javax.swing.plaf.basic.BasicListUI.getPreferredSize(BasicListUI.java:566)
        at javax.swing.JComponent.getPreferredSize(JComponent.java:1632)
        at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
        at java.awt.Container.layout(Container.java:1398)
        at java.awt.Container.doLayout(Container.java:1387)
        at java.awt.Container.validateTree(Container.java:1485)
        at java.awt.Container.validate(Container.java:1457)
        at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:670)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:127)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        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)
=====================================================================================

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3

        at javax.swing.plaf.basic.BasicListUI.updateLayoutState(BasicListUI.java:1356)
        at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1299)
        at javax.swing.plaf.basic.BasicListUI.getPreferredSize(BasicListUI.java:566)
        at javax.swing.JComponent.getPreferredSize(JComponent.java:1632)
        at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
        at java.awt.Container.layout(Container.java:1398)
        at java.awt.Container.doLayout(Container.java:1387)
        at java.awt.Container.validateTree(Container.java:1485)
        at java.awt.Container.validate(Container.java:1457)
        at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:670)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:127)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        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)
我的程序中确实有各种.validate()和.repaint()语句,以确保它正确运行。因为我的程序看起来很好,这是否意味着我可以忽略错误?我能做些什么来避免错误消息

===================================================================================== 以下是更多详细信息:
Java版本jdk1.6.0_11
如何初始化列表:

for (int Selector_Id=0;Selector_Id<6;Selector_Id++)
{
  Stock_Symbol_Data[Selector_Id]=new DefaultListModel();
  Stock_Symbol_List[Selector_Id]=new JList(Stock_Symbol_Data[Selector_Id]);
  Stock_Symbol_ScrollPane[Selector_Id]=new JScrollPane(Stock_Symbol_List[Selector_Id]);
}
...
Stock_Symbol_Data[A_Selector_Id].clear();

if (Selected_Symbols_Vector.size()>0)
  for (int i=0;i<Selected_Symbols_Vector.size();i++)
    Stock_Symbol_Data[A_Selector_Id].addElement(Selected_Symbols_Vector.elementAt(i));
for(int-Selector\u-Id=0;Selector\u-Id=0)

对于(int i=0;i您是如何设置数据模型的?UI组件被告知数据模型中至少有4项,但模型中没有那么多项。

这里的明显问题是您在不同的线程中修改模型,而不是在Swing事件队列中。如果是这样,您在h您应该处理的代码(将更改包装在Runnable中,如果没有其他内容,则调用SwingUtilities.invokeLater)


如果没有,我肯定看到过这样的情况:您只看到一个swing bug,不值得让您的应用程序崩溃。但是考虑到堆栈跟踪的性质,我认为这是不可能的,更可能的原因是线程和事件队列).

我想这个例外也是因为同时修改了一些swing对象数组


SwingWorker具有“进行中事件”选项。您需要覆盖
进程(列表块)
受保护的方法,并使用
无效发布(V…块)
方法将状态更新发送到UI。在您的处理案例中,这意味着定期提交部分结果,以便用户不会感到厌烦。

我认为Yishai是正确的。我有一个类似的行为,并将其包装到…EventQueue中。invokeLater…解决了我的问题

java.awt.EventQueue.invokeLater(new Runnable() {
    @Override
        public void run() {
            listModel.addElement(book);
            jListBooks = new JList(listModel);
            jListBooks.setCellRenderer(new RobotBookListRenderer());
            jScrollPane1.setViewportView(jListBooks);
            jListBooks.updateUI();
        }
    });

我遇到了这个问题,我刚刚发现:

  • 如果您有一个JList对象
  • 调用:listModel.removeAllElements()时
  • 然后将元素添加到listModel
它有时执行valueChanged事件

这可能是随机的。我的代码是在SwingWorker内部执行的。 解决方案不是调用removeAllElements,而是创建一个新的ListModel

不要这样做:

DefaultListModel listModel=(DefaultListModel)myJList.getModel(); listModel.removeAllElements()

这样做:

DefaultListModel listModel=新的DefaultListModel(); myJList.setModel(listModel)

此代码有时执行valueChanged方法:


listModel.addElement(symbol);

您能发布创建/初始化JList的代码吗?永远不要忽略Java(或任何编程语言)向您抛出的错误。您可能没有注意到任何错误,但通常这样的错误会引起关注,并可能会影响您。最好现在就处理它,因为它在您的头脑中是新鲜的,并且您没有在此基础上编写过很多代码。您使用的是哪一版本的java?在进行多线程处理时出现随机错误是确定的标志你做错了。你能发布SwingWorker吗?是的,你完全正确,虽然我一直在使用SwingWorker,但我从未使用过publish()和process()方法,这是第一次学习如何使用它。