import java.util.Observable;
public class DateSubject extends Observable {
// 封装被观察的数据
private int widthInfo;
private int heightInfo;
public int getWidthInfo() {
return widthInfo;
}
public void setWidthInfo(int widthInfo) {
this.widthInfo = widthInfo;
// 数据改变后,setChanged()必须被调用,否则notifyObservers()方法会不起作用
this.setChanged();
}
public void setHeightInfo(int heightInfo) {
this.heightInfo = heightInfo;
this.setChanged();
}
public int getHeightInfo() {
return heightInfo;
}
}
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class FrameSubject extends JFrame {
private static final long serialVersionUID = 1010334549420828435L;
JTextField jTextField1 = new JTextField("100");
JTextField jTextField2 = new JTextField("100");
JButton jbutton = new JButton("click");
FrameSubject() {
this.setLayout(new FlowLayout());
this.setSize(100, 100);
this.add(jTextField1);
this.add(jTextField2);
this.add(jbutton);
jbutton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent paramActionEvent) {
jButton1_actionPerformed(paramActionEvent);
}
});
}
// 因为无法使用多重继承,这儿就只能使用对象组合的方式来引入一个
// java.util.Observerable对象了。
DateSubject subject = new DateSubject();
// 这个方法转发添加Observer消息到DateSubject。
public void registerObserver(java.util.Observer o) {
subject.addObserver(o);
}
// 数据改变,事件被触发后调用notifyObservers()来通知Observer。
void jButton1_actionPerformed(ActionEvent e) {
subject.setWidthInfo(Integer.parseInt(jTextField1.getText()));
subject.setHeightInfo(Integer.parseInt(jTextField2.getText()));
subject.notifyObservers();
}
}
import java.awt.FlowLayout;
import java.util.Observable;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class FrameObserver extends JFrame implements java.util.Observer {
/**
* 2013-3-28
* @author Administrator
*/
private static final long serialVersionUID = 1L;
JLabel jLabel1 = new JLabel("1");
JLabel jLabel2 = new JLabel("2");
JLabel jLabel3 = new JLabel("3");
JLabel jLabel4 = new JLabel("4");
FrameObserver() {
this.setLayout(new FlowLayout());
this.setSize(100, 100);
this.add(jLabel1);
this.add(jLabel2);
this.add(jLabel3);
this.add(jLabel4);
}
// 观察的数据
int widthInfo = 0;
int heightInfo = 0;
// 在update()方法中实现对数据的更新和其它必要的反应。
@Override
public void update(Observable o, Object arg) {
DateSubject subject = (DateSubject) o;
widthInfo = subject.getWidthInfo();
heightInfo = subject.getHeightInfo();
jLabel1.setText("The heightInfo from subject is: ");
jLabel3.setText(String.valueOf(heightInfo));
jLabel2.setText("The widthInfo from subject is: ");
jLabel4.setText(String.valueOf(widthInfo));
}
}
public class Test{
public static void main(String[] args) {
FrameSubject subject = new FrameSubject();
FrameObserver observer = new FrameObserver();
// 在Subject中注册Observer,将两者联系在一起
subject.registerObserver(observer);
subject.setVisible(true);
observer.setVisible(true);
}
}