2009-06-25 10 views
0

私のプログラムは正常にそれを実行しますが、次のエラーメッセージが生成され、まだメッセージには、エラーの原因となった私のプログラムの行言いませんでした、何ができるのJPanel、JListの、JScrollPaneに...Java Swing BasicUIアップデートエラー、どうすればよいですか?

スイング使用しています私がやります ?

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

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()文を持っています。私のプログラムはうまく見えるので、エラーを無視することができますか?エラーメッセージを避けるために私ができることは何ですか?

============================================== ======================================= ここで詳細:
< 1>私はリストを初期化する方法Javaバージョンjdk1.6.0_11
< 2>:

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私のプログラムは、分について必要と非常に長いリストを、initにする必要があるため、権利です。私は、initが完了する前に、UIを参照するのを待つことができないので、私は「SwingWorkerの」クラスでそれを入れて、アプリのUIウィンドウが開いた後、それが初期化を行いましょう。そうすることで、最初のウィンドウが開くのを待つのではなく、UI内から進捗状況を確認できます。それは私のUIの更新プロセスを台無しにしているPCの低速だと思われる。後で私が高速のマシンに移動すると、スイングはこれをまっすぐにするか、これについて正しいのですか?

は私が「(Runnableをの変化をラップし、SwingUtilities.invokeLaterを呼び出し)」アプローチを使用しようとしましたが、私は期待どおりに動作しませんでした。すべてのリストが埋められるまで待ってから、最初のウィンドウを開きます。つまり、最初のUIが表示される前に空の画面を1分間見なければなりません。

SwingWorkerので

は、それが今でランダムにエラーメッセージが表示さ - 時々ここでは、時々そこに、他の回すべてではありません。

私のSwingWorkerのは、次のようになります。

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); } 
} 
+0

JListを作成/初期化するコードを投稿できますか? –

+0

Javaがあなた(またはそれに関するプログラミング言語)からスローするエラーは決して無視しないでください。何か間違っていることに気づかないかもしれませんが、通常このようなエラーが心配の原因です。それはあなたの頭の中で新鮮であり、あなたはこれの上に多くのコードを書いていない間、今すぐそれを世話する方が良いです。 – AlbertoPL

+0

どのJavaのバージョンを使用していますか? – akf

答えて

1

も例外ではいくつかのスイングオブジェクト配列の同時変更理由。

SwingWorkerのは、「進行中のイベント」のオプションがあります。process(List<V> chunks)保護されたメソッドをオーバーライドし、void publish(V... chunks)メソッドを使用してUIにステータス更新を送信する必要があります。処理の場合、これは定期的に部分的な結果を提出してユーザーが飽きないようにすることを意味します。

+0

はい、私はSwingWorkerを使っていましたが、publish()メソッドとprocess()メソッドを使ったことはありませんでしたが、使い方を学ぶのは初めてです。 – Frank

0

はどのようにあなたのデータモデルを設定していますか? UIコンポーネントには、dataModelに少なくとも4つのアイテムが含まれていると伝えられていますが、モデルにはその数がありません。

2

ここに懸念のための明らかな原因は、あなたが別のスレッドではなく、Swingのイベントキューにあなたのモデルを修正することです。その場合は、あなたが(Runnableをの変化をラップし、何もない場合はSwingUtilities.invokeLaterをを呼び出す)対処すべきであるあなたのコードに問題があります。

ない場合、私は確かにあなただけのスイングのバグを参照してください例を見てきましたし、それはあなたのアプリケーションの上にクラッシュ価値はありません。しかし、このスタックトレースの性質を考えると、そうはないと言えます。なぜなら、スレッドとイベントキューが原因である可能性が高いからです)。私は推測

3

私は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(); 
     } 
    }); 
+1

'SwingUtilities.invokeLater'も同様に動作するはずです – Tombart

0

私はこの問題を持っていただけのことを考え出し:あなたが呼び出すときに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);

  • 関連する問題