AWT事件线程中断
问题描述:
我有代码:AWT事件线程中断
import java.awt.Dimension;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test2 {
JFrame frame = null;
JPanel panel = null;
JButton button = null;
Task task = null;
Indicator indicator = null;
Runnable computation;
public static void main(String[] args) {
new Test2().start();
}
public void start() {
SwingUtilities.invokeLater(new Dialog());
}
private void process1() {
int result = 0;
for (int i=0; i<100000; i++) {
result = (int) Math.ceil(++result + Math.sqrt(result));
System.out.println("proc1 " + result);
}
}
private void process2() {
int result = 0;
for (int i=0; i<100000; i++) {
result = (int) Math.ceil(++result + Math.sqrt(result)*500);
System.out.println("proc2 " + result);
}
}
private class Computation implements Runnable {
public void run() {
process1();
task.setProgress(2);
process2();
task.setProgress(3);
}
}
private class Dialog implements Runnable {
public Dialog() {
}
public void run() {
frame = new JFrame("Test");
panel = new JPanel();
panel.setPreferredSize(new Dimension(300, 200));
frame.getContentPane().add(panel);
button = new JButton("b1");
panel.add(button);
indicator = new Indicator();
task = new Task();
task.addObserver(indicator);
frame.pack();
frame.setVisible(true);
computation = new Computation();
SwingUtilities.invokeLater(computation);
}
}
private class Task extends Observable {
int progress;
public Task() {
}
public void setProgress(int progress) {
this.progress = progress;
setChanged();
notifyObservers();
}
public int getProgress() {
return progress;
}
}
private class Indicator implements Observer {
@Override
public void update(Observable arg0, Object arg1) {
button.setText(((Task)arg0).getProgress()+"");
}
}
}
所以我有两个耗时的操作(过程1和过程2)。我的目标是在process1完成之后,更新摆动按钮(请参阅task.setProgress方法)。
问题在于,更新在process1()和process2()完成后执行。
答
..更新在process1()和process2()完成后执行。
不要在EDT上执行长时间运行的任务,详情请参见Concurrency in Swing。一种方法是使用SwingWorker
。
..如果我用两个
SwingWorkers
执行process1()
和process2()
,那么他们的执行顺序是不可预知的。我需要process2()
后跟process1()
。我如何获得这个?
呼叫这两种方法中的1 SwingWorker
的doInBackground()
方法,调用SwingWorker.setProgress(int)与在适当的时间在适当的值。例如。
... doInBackground() {
setProgress(0);
process1();
setProgress(50);
process2();
setProgress(100);
}
+1 @CHEM_Eugene,我认为'button.setText(((任务)为arg0).getProgress()+ “”);'只调用一次,再有进步的任何更新,但你可以如果我使用两个SwingWorkers执行process1()和process2(),那么它们的执行顺序是不可预知的,那么请添加System.out.println,或者将此代码行包装到invokeLater() – mKorbel
Andrew Thompson中。我需要process2()遵循process1()。我如何获得这个? –
使用一个'SwingWorker'来调用'process1()'然后'process2()'(按照这个顺序)。虽然我一定误解了你,因为这个答案看起来很直观。 –