Ant*_*mba 5 java swing multithreading swingworker progressmonitor
我有一个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();
Run Code Online (Sandbox Code Playgroud)
进度更新工作正常,但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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)