JProgressBar で、以下の例外が、たまに発生します。
ダイアログに、JProgressBarをのせ、
処理進捗状況をスレッドで表示させています。
ダイアログを表示した際に、発生します。
何が、原因でしょうか。
また、回避する方法はありますか。
javaは、1.6です。
以下実装ソースです。実際、とても長いので省略します。
UserClass : 印刷処理を利用するクラス
PrintClass : 印刷処理を行うクラス
ProgDlgClass:進捗管理ダイアログクラス
java
1/** 印刷処理を利用するクラス */ 2class UserClass extend JFrame { 3 /** 印刷処理 */ 4 private void PrintProc ( ){ 5 PrintClass printCl = new PrintClass(); 6 printCl.executePrint( this ); 7 } 8 9} 10/** 印刷処理を行うクラス */ 11class PrintClass { 12 13 JFrame frame; 14 ProgDlgClass dialog; 15 /** 印刷処理 */ 16 public void executePrint( JFrame frame ) { 17 18 dialog = new ProgDlgClass( frame, false );// モーダル false 19 20 dialog.setProgressMaximum( 0 ); 21 dialog.setProgressMaximum( 0 ); 22 dialog.setProgressValue( dialog.getProgressMinimum() );//最小値をセット 23 dialog.setProgressAuto( true ); // 最初は不確定モード 24 25 // 進捗表示のスレッド 26 Thread thread = new Thread( new Runnable() { 27 @Override 28 public void run() { 29 try { 30 dialog.execute(); 31 } 32 catch ( Exception e ) { 33 //ここで例外ログ表示 34 } 35 } ); 36 thread.start(); 37 displayWaiting(); 38 39 // 印刷処理実行スレッド 40 Thread thread2 = new Thread( new Runnable() { 41 public void run() { 42 executePrint(); 43 } 44 } ); 45 thread2.start(); 46 47 } 48 49 /** 進捗画面の表示待ち */ 50 private void displayWaiting() throws Exception { 51 for ( short i = 0; i < 300; i++ ) { 52 if ( dialog != null && dialog.isVisible() ) { 53 Thread.sleep( 100 ); 54 return; 55 } 56 Thread.sleep( 10 ); 57 } 58 } 59 /** 印刷データ作成 */ 60 private void executePrint() { 61 for( int i = 0 ; i < ・・・ ) { 62 dialog.setProgressValue( i ); 63 //印刷データ作成 こちらで、プログレスバーの値を設定し、進捗状況を管理 64 } 65 } 66 67} 68 69/** 進捗管理 */ 70public class ProgDlgClass extends JDaialg { 71 72 private JProgressBar jProgressBar1 = new JProgressBar(); 73 private int progressMinimum; 74 private int progressMaximum; 75 private JPanel = panel1 = new JPanel (); 76 77 /** コンストラクタ*/ 78 public ProgDlgClass( Frame owner, boolean modal ) { 79 super( owner, modal ); 80 jProgressBar1.setStringPainted(true); 81 panel1 .add(jProgressBar1); 82 jProgressBar1.setBounds(10, 10, 220, 30); 83 this.getContentPane().add(panel1 , java.awt.BorderLayout.CENTER); 84 this.setPreferredSize( new Dimension( 245, 140 ) ); 85 } 86 87 /** 88 * 開始 89 */ 90 public void execute() throws Exception { 91 if ( this.progressMaximum == 0 && 92 this.progressMinimum == 0 && 93 this.progressAuto == false ) { 94 // ここは、progressAuto = trueのため、今回は通らない 95 return; 96 } 97 this.setVisible( true ); 98 } 99 100 /**プログレスバーの最大値設定 */ 101 public void setProgressMaximum( int wkValue ) { 102 this.progressMaximum = wkValue; 103 this.jProgressBar1.setMaximum( wkValue ); 104 } 105 106 /** プログレスバーの最小値設定*/ 107 public void setProgressMinimum( int wkValue ) { 108 this.progressMinimum = wkValue; 109 this.jProgressBar1.setMinimum( wkValue ); 110 } 111 112 /** プログレスバーの最小値設定*/ 113 public int getProgressMinimum() { 114 return this.progressMinimum = wkValue; 115 } 116 117 /** プログレスバーの最小値設定*/ 118 public int getProgressMinimum() { 119 return this.progressMinimum = wkValue; 120 } 121 122 /** プログレスバーの現在値を設定 123 * @param wkValue 設定しようとするプログレスバーの現在値 124 */ 125 public void setProgressValue( int wkValue ) { 126 this.jProgressBar1.setValue( wkValue ); 127 } 128 129 /** プログレスバーの自動処理状態を設定します。 130 * @param wkBool 自動処理状態 true:勝手に動作します。 131 */ 132 public void setProgressAuto( boolean wkBool ) { 133 this.progressAuto = wkBool; 134 this.jProgressBar1.setIndeterminate( this.progressAuto ); 135 this.jProgressBar1.setStringPainted( !this.progressAuto ); 136 } 137}
PrintClass の executePrintがexecuteされ、ProgDlgClass が表示された時に例外が発生。
終了は別途ボタンが有り、ボタン押下でdispose()が実行されます。
以下 例外内容
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at java.awt.Container.createHierarchyEvents(Container.java:1357)
at java.awt.Container.createHierarchyEvents(Container.java:1357)
at java.awt.Container.createHierarchyEvents(Container.java:1357)
at java.awt.Container.createHierarchyEvents(Container.java:1357)
at java.awt.Container.createHierarchyEvents(Container.java:1357)
at java.awt.Dialog.conditionalShow(Dialog.java:939)
at java.awt.Dialog.show(Dialog.java:1040)
at java.awt.Component.show(Component.java:1516)
at java.awt.Component.setVisible(Component.java:1468)
at java.awt.Window.setVisible(Window.java:841)
at java.awt.Dialog.setVisible(Dialog.java:991)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。