Jay*_*Jay 2 java design-patterns observer-pattern
任何人都可以解释为什么我点击这个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;
}
}
Run Code Online (Sandbox Code Playgroud)
你需要打电话Observable.setChanged.请注意,API文档notifyObservers以"如果此对象已更改,如hasChanged方法所示"开头.
但实际上,我强烈建议不要使用java.util.Observable和Observer.
正如汤姆所说,你必须先打电话Observable.setChanged.
Observable在Java中实现的问题是它来自JDK 1.0,这不是必须的,但它没有更新,因为它们:(.
除此之外我没有看到任何问题,但考虑到Observable不使用弱引用的观察者(WeakReference出现在Java 1.2中),所以你必须小心总是调用deleteObserver不生成泄漏时,观察者不再是必要的.
另一种选择,但具有更复杂的接口是实用程序类PropertyChangeSupport.Swing侦听器基于PropertyChangeListener接口和实用程序类,因此如果您在UI代码中使用它,您会发现它更合适.
| 归档时间: |
|
| 查看次数: |
3088 次 |
| 最近记录: |