【问题标题】:update gui with SwingWorker使用 SwingWorker 更新 gui
【发布时间】:2014-04-10 21:18:58
【问题描述】:

我正在尝试使用类生成并发送到SwingWorker 的值来更新progressBar

在 GUI 中我有这个方法:

@Override
public void propertyChange(PropertyChangeEvent evt) {
   if (evt.getPropertyName().equals("progress")) {
      int progress = (Integer) evt.getNewValue();
      jProgressBar1.setValue(progress);
   }
}

我也在这样做:

private void startWorker(){
     worker = WorkerUpdater.getInstance();    
     worker.addPropertyChangeListener(this);
     worker.execute();
}

SwingWorker 中,我有一个方法"setProgress" 可以从计算它的对象更新变量的值,然后我希望SwinWorker 读取这个值并重新绘制progressBar

如何在doInBackground() 方法中做到这一点?我有下一个方法,但我想在每次SwingWorker 中属性“进度”的值发生变化时更新progressBar

如果我这样做,它就可以工作,但我只想在其他类修改 SwingWorker 属性中的 de 值“progress”时更新 progressBar。我该怎么做?

@Override
    public Void doInBackground() throws Exception {
        while(this.progress<100){
           setProgress(this.progress+10);
           this.progress += 10;
        }       
        return null;
    }

【问题讨论】:

    标签: java swing swingworker


    【解决方案1】:

    然后我希望SwinWorker 读取此值并重新绘制progressBar

    这不是必需的 - SwingWorker 保证每当调用 setProgress 时将传递给 PropertyChangeListener 的属性更改通知将发生在事件调度线程上,因此 propertyChanged 是正确的位置更新进度条等组件。

    【讨论】:

    • 但是我必须在 doInBackground() 方法中调用 setProgress 吗?我可以从其他类调用 setProgress 吗?像这样:Worker.getInstance().setProgress(x)
    • @mreigosa 问题是 setProgress 在 SwingWorker 中是 protectedfinal,因此无法从 Worker 类之外访问它。如果您希望能够从外部调用它,那么您必须编写另一个方法 public void progress(int p) { setProgress(p); } 或类似的方法供“外部人员”调用。
    • 我按照你说的做了,但是 progressBar 的值没有改变。发生了什么?我不明白,因为我发送给 SwingWorker 的值是正确的。后台方法中的 SwingWorker 有什么用?
    • @mreigosa 和包含 propertyChanged 方法的 GUI 类肯定已在 Worker 实例上注册为 PropertyChangeListener?
    • @Ian Roberts 只有几个来自 SwingWorker 和 PropertyChangeListener 的标志(START、END、PENDING、ERROR/EXCEPTION???)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多