编辑:我知道有很多代码,但它很简单,很有希望!
我编写了以下代码,试图在两个JFrame之间传递e(来自mouseListener)。我唯一的要求是使用Observable / interfaces / events传递值(而不是参数)
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Observable;
import javax.swing.JFrame;
public class CustomJFrame extends JFrame implements MouseListener
{
Observable observe = new Observable();
public CustomJFrame()
{
setSize(new Dimension(600,800));
addMouseListener(this);
setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e)
{
System.out.println("Clicked");
observe.notifyObservers(e);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public Observable getObservable() {
return observe;
}
public void setObservable(Observable observe) {
this.observe = observe;
}
}
收到“e”的班级:
import java.awt.Label;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
public class CallMe extends JFrame implements Observer
{
Label result = new Label("Still to be changed");
public CallMe()
{
add(result);
setSize(600,600);
setVisible(true);
}
@Override
public void update(Observable o, Object arg)
{
System.out.println("Called");
result.setText(arg.toString());
}
}
最后主要
import java.util.Observable;
public class MainClass
{
public static void main(String[] args)
{
CustomJFrame jf = new CustomJFrame();
CallMe cm = new CallMe();
Observable ob = new Observable();
ob.addObserver(cm);
jf.setObservable(ob);
}
}
那有什么不对?
答案 0 :(得分:3)
Observable.notifyObservers()才会通知观察者。设置更改的方法是调用setChanged() - 该方法为protected
而不是public
。换句话说,您的意思是扩展Observable
,而不是使用普通的Observable
对象。 (为什么课程不抽象,我不知道。因为扩展它是使用它的唯一方法所以它是有意义的。)