以下代码我写的关于Observable的代码,意图是当点击两个Button中的任何一个时,两个Button的Label都变为“clicked“,但是运行时却是点击哪个Button哪个上Button变而已,为什么得不到正确的结果呢?实在找不出哪里有错了,各位大哥大姐帮帮忙,谢谢了。
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class NewObservable extends Observable
{
public void notifyObservers(Object b)
{
setChanged();
super.notifyObservers(b);
}
}
class NewButton extends Button implements Observer
{
public NewButton()
{
super();
}
public NewButton(String s)
{
super(s);
}
public void update(Observable ob,Object arg)
{
((NewButton)arg).setLabel("clicked");
}
}
public class TestObserver extends Frame implements ActionListener
{
NewButton b1=new NewButton("b1"),b2=new NewButton("b2");
Observable ob=new NewObservable();
public TestObserver()
{
ob.addObserver(b1);
ob.addObserver(b2);
setLayout(new FlowLayout());
b1.addActionListener(this);
b2.addActionListener(this);
add(b1);
add(b2);
setSize(300,200);
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
ob.notifyObservers((NewButton)e.getSource());
}
public static void main(String[] args)
{
new TestObserver();
}
}

解决方案 »

  1.   

    在NewButton中的update函数应该改为
      public void update(Observable ob,Object arg)
            {
             // ((NewButton)arg).setLabel("clicked");
              this.setLabel("clicked");
         }因为当这个observer接到notify之后是要更新自己的label,所以当button1和button2接到notify之后都会更新。楼主原来的代码的意思是只更新被按下的button的label,所以不合适本人已经测试过
      

  2.   

    你应该把对 状态( 主题) Observable 感兴趣的对象 button1, button2 ,加入 Observer 队列 ob 中。但状态改变时, Observable  会通知所有 观察员Observer, 
    super.notifyObservers(b); 这里 b 是 状态, 不应该被理解成  Observer .
    ( 你上面把一个按钮当成了  notifyObservers () 的参数是错误的, b 应该是 observer 感兴趣的状态)。notifyObservers () 检查所有已经被 addObserver 到队列中的 Observer , 告知它们 有状态改变了, 代表状态的对象是  b. 
      

  3.   

    class NewObservableextends Observable
    {
    public void notifyObservers(Object status)
    {
    setChanged();
    super.notifyObservers(status);
    }
    }
    .../////////////
    public class TestObserver extends Frame implements ActionListener
    {
    NewButton b1=new NewButton("b1"),b2=new NewButton("b2");
    Observable ob=new NewObservable();
       
           ob.addObserver(b1);  // 添加 观察员 b1,b2 让它们观察 NewObservable 状态改变。
           ob.addObserver(b2);  // 当状态改变时, NewObservable 会通知已经加入的观察员。
         //. ...
    }