【问题标题】:Observer/Observable Help!观察者/可观察的帮助!
【发布时间】:2011-06-09 06:09:59
【问题描述】:

您好,

我一直在研究模型-视图-控制器的 Obsser/Observable 实现。 我也可能误用了这种模式,但这是我到目前为止所做的。 在我的代码中。当 Submit 被按下时,它会触发 Model 的 makeChange()。 但永远不会触发Testing的update()。

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Testing implements Observer {

    public Testing() {
        model.addObserver(this);
        loadListener1();        
    }

    private void loadListener1() {
        view1.submitButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                model = new Model(view1.data1Field.getText(), view1.data2Field.getText());
                model.makeChange();
                model.notifyObservers();
            }
        });
    }  

    public void update(Observable o, Object arg) { System.out.println("Notify - Observer"); }

    public static void main(String[] a) { Testing testing = new Testing(); }

    private View view1 = new View("1");    
    private Model model = new Model();

}

class View extends JFrame  {

    public View(String frame) {
        super("Frame: " + frame);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
        setVisible(true);
        setLayout(new GridLayout(3, 2));
        add(data1Label); add(data1Field);
        add(data2Label); add(data2Field);
        add(submitButton); add(cancelButton);
    }

    private final JLabel data1Label = new JLabel("Data1");
    private final JLabel data2Label = new JLabel("Data2");
        public final JTextField data1Field = new JTextField();
    public final JTextField data2Field = new JTextField();
    public final JButton submitButton = new JButton("Submit");
    public final JButton cancelButton = new JButton("Cancel");

}

class Model extends Observable {

    public Model() { }
    public Model(String data1, String data2) {
        setData1(data1);
        setData2(data2);
    }
    public String getData1() { return data1; }
    public final void setData1(String data1) { this.data1 = data1; }
    public String getData2() { return data2; }
    public final void setData2(String data2) { this.data2 = data2; }
    public void makeChange() {
        setChanged();
        notifyObservers();
        System.out.println("Notify - Observable");
    }
    private String data1;
    private String data2;

}

你能指导我过去吗? 非常感谢您的回复。

谢谢, 西里尔 H.

【问题讨论】:

  • 当您使用调试器单步执行代码时,您会看到什么?
  • @Peter:我认为 update() 方法从未被触发。但不知道为什么...
  • 您的代码有多少次调用 new Model()?换句话说,你的程序中有多少模型对象?哪个被观察?哪个通知观察员?这会对输出产生什么影响?
  • 目前只有一个模型,并且只调用一次。但后来我必须将模型传递给不同的控制器(我将为此更新上面的代码)。但是现在的代码必须有这些输出(不知道先发生什么) - “Notify - Observable”和“Notify - Observer”。测试会通知模型。
  • @Cyril,这就是我建议你使用调试器的原因。在您知道代码正在运行的地方放置一个断点,然后单步执行,直到它没有按照您的预期运行。

标签: java model-view-controller observer-pattern observable


【解决方案1】:

在类的构造函数中测试您的寄存器本身到在字段初始化期间创建的模型实例。

在提交按钮的 actionPerformed 方法中,您创建了一个模型的 new 实例,然后在这个新实例上调用没有注册观察者的方法 notifyObservers!

试试这个代码:

private void loadListener1() {
    view1.submitButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            model.setData1(view1.data1Field.getText()),
            model.setData2(view1.data2Field.getText());
            model.makeChange();
        }
    });
}

【讨论】:

  • 我认为最简单的方法是在子更新方法中调用父更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2014-03-24
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多