Frage

Ihr Programm verwendet Schwingen JPanel, JList, JScrollPane ...

Es läuft gut, aber erzeugt die folgende Fehlermeldung, und noch in der Botschaft sagen, es ist nicht die Linie meines Programms den Fehler verursacht hat, was kann ich tun?

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

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)

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

ich verschiedene .validate haben () und .repaint () Aussagen in meinem Programm sicherstellen, dass es richtig läuft. Weil mein Programm sieht gut aus, bedeutet, dass ich den Fehler ignorieren kann? Alles, was ich kann, um die Fehlermeldung zu vermeiden tun?

=============================================== ====================================== Hier gibt es mehr Details:
<1> Java-Version jdk1.6.0_11
<2> Wie ich init die Liste:

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));

Yishai ist richtig, da mein Programm eine sehr lange Liste an init braucht, die etwa eine Minute erfordert. Ich kann die UI abwarten, bevor die init beendet ist, so dass ich es in einer „Swingworker“ Klasse und lassen Sie es die init tun, nachdem das App UI-Fenster wird geöffnet; auf diese Weise ich den Fortschritt innerhalb der UI sehe eher dann warten, bis das erste Fenster zu öffnen. Es scheint mir, es ist die Langsamkeit der PC, der die UI Update-Prozess ist vermasselt; wenn ich später Umzug in eine schnellere Maschine, Schaukel sollte dies begradigen, oder habe ich recht darüber?

Ich habe versucht, die „(wickeln Sie die Änderung in einem Runnable und rufen SwingUtilities.invokeLater)“ Ansatz zu verwenden, aber es hat nicht funktioniert, wie ich erwartet hatte. Er wartet, bis alle die Liste in gefüllt ist, dann das erste Fenster öffnet; das heißt, ich habe eine Minute lang bei leeren Bildschirm zu sehen, bevor die erste UI angezeigt wird.

Mit Swingworker, es zeigt nun die Fehlermeldung zufällig -. Manchmal hier, mal da, mal überhaupt nicht

Meine Swingworker sieht wie folgt aus:

class Update_Selection_Worker extends SwingWorker<Integer,Integer>             // Look into SwingWorkerDemo in Fit for details
{
  int Selector_Id;
  boolean Update_Only_This_Selector;
  Stock_Image_Scanner Stock_image_scanner;

  public Update_Selection_Worker(int Selector_Id,boolean Update_Only_This_Selector,Stock_Image_Scanner Stock_image_scanner)
  {
    this.Selector_Id=Selector_Id;
    this.Update_Only_This_Selector=Update_Only_This_Selector;
    this.Stock_image_scanner=Stock_image_scanner;
  }

  @Override
  protected Integer doInBackground() throws Exception
  {
//    Out("  In Update_Selection_Worker  Selector_Id="+Selector_Id);

    if (Update_Only_This_Selector)          // Only need to update from Rules_Panel_Id, eariler ones haven't changed
    {
      Stock_image_scanner.Update_Selector_List(Selector_Id);
      Thread.sleep(5);
      publish(Selector_Id);
    }
    else for (int i=Selector_Id;i<Stock_image_scanner.Rules_Panel_Count;i++)
    {
      Stock_image_scanner.Update_Selector_List(i);
      Thread.sleep(5);
      publish(i);
    }

    return 1;
  }

  @Override
  protected void process(java.util.List<Integer> chunks)                       // As the worker thread executes, it can publish results of V type. Override the process method to work with intermediate results.
  {
    for (final int i : chunks)
    {
      SwingUtilities.invokeLater(new Runnable()
      {
        public void run()
        {

          Stock_image_scanner.Selector_Total_Label[i].setText(Stock_image_scanner.Stock_Symbol_Data[i].getSize()+"");
          Stock_image_scanner.Stock_Symbol_List[i].revalidate();
          Stock_image_scanner.Stock_Symbol_List[i].repaint();
          Stock_image_scanner.Stock_Symbol_ScrollPane[i].revalidate();
          Stock_image_scanner.Stock_Symbol_ScrollPane[i].repaint();
          Stock_image_scanner.Selector_Panel[i].revalidate();
          Stock_image_scanner.Selector_Panel[i].repaint();

        }
      });
    }
  }

  @Override
  protected void done()
  {
  }

  public static void out(String message) { System.out.print(message); }
  public static void Out(String message) { System.out.println(message); }
}
War es hilfreich?

Lösung

Ich denke, auch die Ausnahme ist, weil die gleichzeitige Modifikation einiger Swing Objektarray.

Swingworker hat die Möglichkeit, für ‚in progress-Ereignissen‘. Sie müssen process(List<V> chunks) geschützte Methode und verwenden Sie die void publish(V... chunks) Methode zu senden Status-Update auf die UI außer Kraft setzen. In Ihrem Verarbeitungs Fall bedeutet dies, Ihre Teilergebnisse in regelmäßigen Abständen vorzulegen, damit der Benutzer nicht langweilig wird.

Andere Tipps

Ich denke, Yishai richtig ist. Ich hatte ein ähnliches Verhalten und Verpackung es in ... EventQueue.invokeLater ... mein Problem gelöst.

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();
        }
    });

Der offensichtliche Grund zur Sorge ist, dass Sie Ihr Modell in einem anderen Thread zu modifizieren, und nicht in der Swing-Ereigniswarteschlange. Wenn das der Fall ist, tun Sie ein Problem mit Ihrem Code haben, sollten Sie (wickeln Sie die Änderung in einem Runnable und rufen SwingUtilities.invokeLater wenn nichts anderes) Adresse.

Wenn nicht, ich habe sicherlich Fälle gesehen, wo man nur einen Schaukel Fehler sehen und es ist nicht wert Absturz der Anwendung über. Aber angesichts der Natur dieses Stack-Trace, ich würde sagen, dass nicht wahrscheinlich ist, desto wahrscheinliche Ursache Threading und die Ereigniswarteschlange).

Wie setzen Sie Ihr Datenmodell auf? Die UI-Komponente wird gesagt, dass Sie mindestens 4 Elemente in dem Datenmodell haben, aber das Modell muß nicht, dass viele haben.

hatte ich dieses Problem und gerade herausgefunden, dass:

  • , wenn Sie ein Objekt JList
  • , wenn Sie anrufen: listModel.removeAllElements ()
  • und fügen Sie dann Elemente in das Listmodel

oder? Manchmal? führt das valuechanged Ereignis.

Das kann zufällig erscheinen. Mein Code wurde innerhalb Swingworker ausgeführt. Die Lösung ist nicht removeAllElements zu nennen, aber ein neues Listmodel.

erstellen

Sie nicht tun:

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

Tun Sie dies:

DefaultListModel Listmodel = new DefaultListModel (); myJList.setModel (Listmodel);

Dieser Code? Manchmal? führt die valuechanged-Methode:

listModel.addElement (Symbol);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top