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 SwingWorkerdoInBackground()方法,调用SwingWorker.setProgress(int)与在适当的时间在适当的值。例如。

... doInBackground() { 
    setProgress(0); 
    process1(); 
    setProgress(50); 
    process2(); 
    setProgress(100); 
} 
+0

+1 @CHEM_Eugene,我认为'button.setText(((任务)为arg0).getProgress()+ “”);'只调用一次,再有进步的任何更新,但你可以如果我使用两个SwingWorkers执行process1()和process2(),那么它们的执行顺序是不可预知的,那么请添加System.out.println,或者将此代码行包装到invokeLater() – mKorbel

+0

Andrew Thompson中。我需要process2()遵循process1()。我如何获得这个? –

+0

使用一个'SwingWorker'来调用'process1()'然后'process2()'(按照这个顺序)。虽然我一定误解了你,因为这个答案看起来很直观。 –