获取Java ProgressMonitor的取消事件 [英] getting the cancel event of Java ProgressMonitor

查看:274
本文介绍了获取Java ProgressMonitor的取消事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个ProgressMonitor pm 和一个SwingWorker sw 。我想在 pm 上按取消 - 按钮时取消SwingWorker。我想这不应该太难,我读了一些关于SwingWorker和ProgressMonitor的教程,但是我无法让它工作。

I have a ProgressMonitor pm and a SwingWorker sw. I want to cancel the SwingWorker when I press the cancel-button on pm. I guess this shouldnt be too hard, and I read some tutorials about SwingWorker and ProgressMonitor, but I can't get this to work.

final ProgressMonitor pm = new ProgressMonitor(frame, "checking", "...", 0, 100);
final SwingWorker sw = new SwingWorker()
{
    protected Object doInBackground() throws Exception 
    {
        doSomethingAndUpdateProgress();
    }
};

sw.addPropertyChangeListener(new PropertyChangeListener()
{
    public void propertyChange(PropertyChangeEvent evt)
    {
        if(evt.getPropertyName().equals("progress"))
        {
            updateProgress();
        }
        if(pm.isCanceled())
        {
            cancelAction();
        }
        if(pm.isDone())
        {
            doneAction();
        }
    }
});

sw.execute();

进度更新工作正常,但 pm.isCanceled()永远不会 true 。我想我需要一个用于ProgressMonitor的propertyChangeListener,但我不知道如何在那里添加一个。

Progress updating is working just fine, but pm.isCanceled() is never true. I suppose I need a propertyChangeListener for the ProgressMonitor, but I dont know how I would add one there.

推荐答案

执行期间您的长时间运行任务,您想要定期检查是否取消了 ProgressMonitor 。这是你的工作,在取消任务是有意义的点检查 - 否则谁知道你可以留下什么资源。

During the execution of your long running task, you want to periodically check if the ProgressMonitor was canceled. It's your job to check that at points where it makes sense to cancel the task - otherwise who knows what resources you could leave hanging.

所以基本上,你想要改变你的 doSomethingAndUpdateProgress()方法,以便它还检查 ProgressMonitor 是否已取消。

So basically, you want to change your doSomethingAndUpdateProgress() method so that it also checks if the ProgressMonitor was canceled.

这是一个演示如何工作的演示:

Here's a demo that shows how this works:

import java.awt.*;
import javax.swing.*;

public class TempProject extends Box{

    public TempProject(){
        super(BoxLayout.Y_AXIS);
        final ProgressMonitor pm = new ProgressMonitor(this, "checking", "...", 0, 100);
        final SwingWorker sw = new SwingWorker<Integer, Integer>()
        {
            protected Integer doInBackground() throws Exception 
            {
                int i = 0;
                //While still doing work and progress  monitor wasn't canceled
                 while (i++ < 100 && !pm.isCanceled()) {
                     System.out.println(i);
                     publish(i);
                     Thread.sleep(100);
                 }
                 return null;
            }


             @Override
             protected void process(java.util.List<Integer> chunks) {
                 for (int number : chunks) {
                     pm.setProgress(number);
                 }
             }

        };

        sw.execute();
    }


    public static void main(String args[])
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                frame.setContentPane(new TempProject());    
                frame.pack();
                frame.setVisible(true);
            }
        });
    }   


}

这篇关于获取Java ProgressMonitor的取消事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆