[英]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.