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

3
我希望在我的进度条完成任务后(也就是当我的SwingWorker的doInBackground方法返回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),地址为pc=0x6e1b0750,pid=4988,tid=5464
#
# JRE版本:7.0-b141
# Java虚拟机:Java HotSpot(TM) Client VM (21.0-b11 mixed mode, sharing windows-x86              
# 问题出在以下帧:
# V  [jvm.dll+0xa0750]
#
# 失败写入核心转储文件。不支持Windows客户端版本的默认小转储。
#

1个回答

5
你似乎在错误地使用SwingWorker。你不应该直接调用doInBackground(),特别是不能在事件分派线程中直接调用--这违反了使用SwingWorker的原因--而是在SW上调用execute。向SwingWorker添加PropertyChangeListener,并根据其更改行为。例如:
  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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接