[英]Java observer and observable
任何人都可以解釋為什么我點擊這個JFrame上的按鈕時沒有調用printobserver上的更新方法?
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;
}
}
你需要調用Observable.setChanged
。 請注意, notifyObservers
的API文檔以“如果此對象已更改,如hasChanged方法所示”開頭。
但實際上,我強烈建議不要使用java.util.Observable
和Observer
。
正如湯姆所說,你必須先調用Observable.setChanged
。
Java中的Observable
實現的問題在於它來自JDK 1.0,這不是必須的,但它沒有更新,因為它們:(。
除此之外,我沒有看到它的任何問題,但考慮到Observable
不使用弱引用觀察者(WeakReference出現在Java 1.2中),所以你必須注意始終調用deleteObserver
不產生泄漏當觀察者不再需要時。
另一個替代方案,但具有更復雜的接口是實用程序類PropertyChangeSupport
。 Swing偵聽器基於PropertyChangeListener
接口和該實用程序類,因此如果您在UI代碼中使用它,您會發現它更合適。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.