当前位置: 首页 > 面试题库 >

获取Java ProgressMonitor的cancel事件

司寇研
2023-03-14
问题内容

我有一个ProgressMonitor pm和一个SwingWorker
sw。我想取消的SwingWorker当我按cancel上-按钮pm。我想这不应该太难,并且我阅读了一些有关SwingWorker和ProgressMonitor的教程,但是我无法使其正常工作。

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,但是我不知道如何在其中添加一个。


问题答案:

在执行长期运行的任务期间,您要定期检查是否ProgressMonitor已取消。在需要取消任务的地方进行检查是您的工作,否则谁知道您可以保留哪些资源。

因此,基本上,您想更改doSomethingAndUpdateProgress()方法,以便它也检查是否ProgressMonitor已取消。

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

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);
            }
        });
    }


}


 类似资料:
  • Cancels asynchronous iteration.

  • 问题内容: 在Tkinter中,我将多个小部件绑定到鼠标左键。单击它们都会触发同一事件。 如何恢复单击了哪个窗口小部件? 我想要这样,当按下状态时,我将能够恢复在触发事件中被按下的小部件。 问题答案:

  • 我正在从事一个小型Drools项目,因为我想了解更多关于使用规则引擎的知识。我有一个名为Event的类,它有以下字段: <代码>字符串标记 可以是任何字符串的标记 我在我的知识库中插入了数百个事件实例,现在我想得到3个最近的事件,它们都标记为“OK”(确定)。我想出了以下代码,它可以工作: 但是我有一种感觉,应该有更好的方法来做到这一点。这很冗长,不容易重复使用:如果我想获取具有

  • 问题内容: 我正在编写一个需要向Android日历中添加一些事件的应用程序。对于插入,我只使用了以下代码: 现在,我想知道是否有可能获得与该事件关联的ID,以这种方式在插入事件并将其ID保存到我的应用程序后,用户可以直接从应用程序内部调用该事件。可能吗? 问题答案: 我提取了用于将事件存储到android日历中的列的列表。这里的清单: [0]“ originalEvent”(id = 830007

  • 问题内容: 我对数据库及其在CRUD操作之外提供的功能不是很熟悉。 我的研究使我 引人注目 。基本上,触发器似乎提供了这种类型的功能: (来自维基百科) 通常,有三个触发事件导致触发器“触发”: INSERT事件(将新记录插入数据库中)。 UPDATE事件(因为记录正在更改)。 DELETE事件(因为一条记录正在被删除)。 我的问题是:当使用某种触发语义对记录进行更新/删除/插入时,数据库是否可以

  • 问题内容: 有什么方法可以获取触发事件的元素的ID? 我在想类似的东西: 当然,如果从第一种形式触发事件,则var 应该包含id ;如果从第二种形式触发事件,则var 应该包含id 。 问题答案: 在jQuery中,始终指触发事件的元素,其中传递给函数的参数在哪里。 还请注意,这也将起作用,但它不是jQuery对象,因此,如果您希望在其上使用jQuery函数,则必须将其称为,例如: