在SwingWorker中停止JProgressBar的不确定模式

时间:2012-05-19 12:58:40

标签: java swing progress-bar swingworker

一旦我的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);
        }
    }
});

这是我得到的错误:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6e1b0750, pid=4988, tid=5464
#
# JRE version: 7.0-b141
# Java VM: Java HotSpot(TM) Client VM (21.0-b11 mixed mode, sharing windows-x86              
# Problematic frame:
# V  [jvm.dll+0xa0750]
#
# Failed to write core dump. Minidumps are not enabled by default on client  

  versions of Windows
#

1 个答案:

答案 0 :(得分: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();