2009-11-08 56 views
0

我會試着用例子來說明我的問題,我試圖創建一個Java程序,它將(最終)併入一個複雜的Swing GUI。基本Java問題,類更新GUI

我Main.java

public class Main extends JFrame implements ActionListener { 

    JTextArea example; 

    public Main() 
    { 

    //... Missing, basic swing code 
     example = new JTextArea(); 
    //... example added to jpanel, jpanel added to jframe, jframe set visible etc. 


    } 

    public void actionPerformed(ActionEvent e) { 


    if(e.getActionCommand().equalsIgnoreCase("Do Something!")) 
    { 
     new DoSomething(); 
    } 

    public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
    new Main(); 
     } 
    }); 

} 

}

所以,現在,我希望我的DoSomething的()類來更新我的例子中的JTextArea,什麼是做到這一點的最好方法是什麼?

我可以將示例的引用傳遞給DoSomething(),所以DoSomething(示例),但這看起來不太好。我也可以將「this」傳遞給DoSomething()並在Main中實現一個updateExample(String newString)方法,但這看起來並不好。

基本上,達到我想要做的最好的方法是什麼?我寫的程序最終會比這個複雜得多,我看不到一種方法可以讓我在沒有太雜亂的情況下做到這一點。

回答

3

看來你正在尋找Observer pattern

我用你的話

import java.util.Observable; 
import java.util.Observer; 


public class Main implements Observer { 
    private DoSomething businessClass; 

    public Main() { 
     businessClass = new DoSomething(); 
     businessClass.addObserver(this); 
    } 

    public static void main(String[] args) { 
     Main main = new Main(); 
    } 

    @Override 
    public void update(Observable obs, Object obj) { 
     // Do whatever you want to do with textarea or other UI components 
    } 
} 

class DoSomething extends Observable { 
    public DoSomething() { 
     Object result = new Object(); // It can be any type not just an object 
     // After finish... 
     setChanged(); 
     notifyObservers(result); 
    } 
} 

,使用這種簡單模式的UI可以隨時瞭解您的DoSomething類的狀態結束了一個小例子,那個類只需要調用notifyObservers方法。因此,您的系統在堅固的情況下保持解耦

+0

輝煌,謝謝! – 2009-11-08 20:18:49

+1

玩了這個之後,我發現觀察者不會被更新,除非我叫setChanged(); notifyObservers();之前 – 2009-11-08 23:56:03

+0

你是對的我錯過了那部分。答案已更新 – 2009-11-09 16:38:31