使用可观察对象或事件或接口传递值

Passing values around using observable or events or interfaces

编辑:我知道有很多代码,但它真的很简单,我保证!

我已经编写了以下代码,试图在两个 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;
    }
}

Class 接收 "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);
    }
}

所以怎么了?

Observable.notifyObservers() will notify the observers only if the observable has been marked as changed. The way to set it changed is calling setChanged() - 该方法是 protected 而不是 public。换句话说,您打算扩展 Observable,而不是使用普通的 Observable 对象。 (为什么 class 不是抽象的,我不知道。它是有意义的,因为扩展它是使用它的唯一方法)。