2011-10-04 63 views
2

我有代碼: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()完成後執行。

回答

4

..更新在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()'(按照這個順序)。雖然我一定誤解了你,因爲這個答案看起來很直觀。 –

相關問題