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

时间:2016-01-23 11:12:54

标签: java swing observer-pattern

编辑:我知道有很多代码,但它很简单,很有希望!

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

那有什么不对?

1 个答案:

答案 0 :(得分:3)

仅当观察者被标记为已更改时,

Observable.notifyObservers()才会通知观察者。设置更改的方法是调用setChanged() - 该方法为protected而不是public。换句话说,您的意思是扩展Observable,而不是使用普通的Observable对象。 (为什么课程不抽象,我不知道。因为扩展它是使用它的唯一方法所以它是有意义的。)