3

doInBackground(SwingWorkerのメソッド)が戻ったらnull(つまり、タスクが完了したら) 、プログレスバーの不確定モードを停止したいと思います。これがボタン内の私のコードです。コードを実行すると、エラーが発生します。コードは次のとおりです。

private void StartButtonMouseClicked(java.awt.event.MouseEvent evt) {                                         

final Main f22 = new Main();

initializer();

f22.getfile(FileName, 0);
f22.execute();

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        jProgressBar1.setIndeterminate(true);
        try {
            if (f22.doInBackground() == null) {
                jProgressBar1.setIndeterminate(false);                        
            }
        } catch (IOException ex) {
            Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
});

これが私が得るエラーです:

#
#致命的なエラーがJavaランタイム環境によって検出されました:
#
#EXCEPTION_ACCESS_VIOLATION(0xc0000005)at pc = 0x6e1b0750、pid = 4988、tid = 5464
#
#JREバージョン:7.0-b141
#Java VM:Java HotSpot(TM)クライアントVM(21.0-b11混合モード、共有ウィンドウ-x86              
#問題のあるフレーム:
#V [jvm.dll + 0xa0750]
#
#コアダンプの書き込みに失敗しました。ミニダンプは、クライアントでデフォルトで有効になっていません  

  Windowsのバージョン
#
4

1 に答える 1

5

SwingWorkerを間違って使用しているようです。直接呼び出すことは絶対doInBackground()にしないでください。特に、イベントディスパッチスレッドで正しく呼び出さないでください。これは、SwingWorkerを使用する理由全体に反します。むしろ、SWでexecuteを呼び出します。PropertyChangeListenerをSwingWorkerに追加し、それに基づいて動作を変更します。

例えば、

  final Main f22 = new Main();
  initializer();
  f22.getfile(FileName, 0);
  f22.addPropertyChangeListener(new PropertyChangeListener() {
     @Override
     public void propertyChange(PropertyChangeEvent pcEvt) {
        if (pcEvt.getNewValue().equals(SwingWorker.StateValue.DONE)) {
           // do your stuff here
        }
     }
  });
  f22.execute();
于 2012-05-19T13:04:26.963 に答える