当我点击此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;
}
}
答案 0 :(得分:5)
您需要致电Observable.setChanged
。请注意,notifyObservers
的API文档以“如果此对象已更改,如hasChanged方法所示”开头。
但实际上,我强烈建议不要使用java.util.Observable
和Observer
。
答案 1 :(得分:5)
汤姆说你必须先致电Observable.setChanged
。
Java中Observable
实现的问题在于它来自JDK 1.0,这不是必须的,但它没有更新,因为它们:(。
除此之外我没有看到它的任何问题,但考虑到Observable
不对观察者使用弱引用(WeakReference出现在Java 1.2中),所以你必须要小心当不再需要观察者时,调用deleteObserver
不会产生泄漏。
另一种选择,但具有更复杂的接口的是实用程序类PropertyChangeSupport
。 Swing监听器基于PropertyChangeListener
接口和该实用程序类,因此如果您在UI代码中使用它,您会发现它更合适。