2009-09-30 203 views
2

任何人都可以解釋爲什麼當我點擊這個JFrame上的按鈕時printobserver上的更新方法沒有被調用?Java觀察者和可觀察的

import java.awt.BorderLayout; 
import java.awt.Frame; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.IOException; 
import java.net.InetAddress; 
import java.net.SocketException; 
import java.util.Observable; 
import java.util.Observer; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 


/** 
* 
*/ 

/** 
* @author james 
* 
*/ 
public class Driver extends JFrame { 


    /** 
    * @param title 
    */ 
    public Driver() { 
     super("click me"); 

     setSize(400, 400); 
     //set up observer 

     final ButtonObservable gw = new ButtonObservable(); 
     Observer o1 = new PrintObserver(); 
     gw.addObserver(o1); 

     setLayout(new BorderLayout()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setExtendedState(Frame.MAXIMIZED_BOTH); 
     JPanel panel = new JPanel(); 
     add(panel, BorderLayout.CENTER);   

     JButton connectBtn = new JButton("print me"); //$NON-NLS-1$ 
     connectBtn.addActionListener(new ActionListener() {   
      public void actionPerformed(ActionEvent e) { 
       gw.buttonPress(); 
      } 
     }); 

     panel.add(connectBtn); 


    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     JFrame mypane = new Driver(); 
     mypane.setVisible(true); 

    } 

} 

class PrintObserver implements Observer 
{ 
    public void update(Observable o, Object arg) 
    { 
     int x = ButtonObservable.getX(); 
     File jf = new File("/home/foo/bar"); 
     try { 
      jf.createNewFile(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("Blah var -= " + x); 
    } 
} 

class ButtonObservable extends Observable 
{ 
    private static int x = 0 ; 

    @Override 
    public int countObservers() 
    { 
     return this.countObservers(); 
    } 

    public void buttonPress() 
    { 
     x += 1; 
     this.notifyObservers(); 

    } 

    /** 
    * @return the x 
    */ 
    public static final int getX() { 
     return x; 
    } 
} 

回答

5

您需要致電Observable.setChanged。請注意,notifyObservers的API文檔以「如果此對象已更改,如hasChanged方法所示」開頭。

但是真的,我強烈建議不要使用java.util.ObservableObserver

+2

@Tom,你可以詳細說說什麼是替代方案嗎? – 2009-09-30 21:34:13

+1

我也想知道。 -1不詳細說明。 – 2010-12-11 14:48:06

+0

爲什麼湯姆?我也不喜歡Java的實現。地獄,我只是不喜歡Java。 – hamstar 2011-10-01 12:33:28

5

正如湯姆說你必須先打電話給Observable.setChanged

與Java中的Observable實現的問題是,它來自於JDK 1.0,這是沒有必要的不錯,但是因爲他們沒有更新:(。

除此之外,我沒有看到任何但是考慮到Observable沒有爲觀察者使用弱引用(WeakReference出現在Java 1.2中),所以你必須小心總是調用deleteObserver當觀察者不再需要時不會產生泄漏。

另一種替代方案是,但接口更復雜的是實用類PropertyChangeSupport。Swing偵聽器基於PropertyChangeListener接口和該實用程序類,所以如果您在UI代碼中使用它,您會發現它更合適。