JFrame观察Controller但从未通知

时间:2012-07-23 12:24:55

标签: java swing netbeans observer-pattern gui-builder

another question开始,我继续使用Singleton Observable。为什么ArticleSelect.update()不执行?

package net.bounceme.dur.usenet.swing;

import java.util.Observable;
import java.util.Observer;
import java.util.logging.Logger;
import javax.swing.ListModel;
import net.bounceme.dur.usenet.controller.ArticleDefaultListModel;
import net.bounceme.dur.usenet.controller.Controller;

public class ArticleSelect extends javax.swing.JPanel implements Observer {

    private static final Logger LOG = Logger.getLogger(ArticleSelect.class.getName());
    private Controller controller = Controller.getInstance();
    private ListModel defaultListModel = new ArticleDefaultListModel();

    public ArticleSelect() {
        controller.addObserver(this);
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jList1 = new javax.swing.JList();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextPane1 = new javax.swing.JTextPane();

        setLayout(new java.awt.BorderLayout());

        jList1.setModel(defaultListModel);
        jScrollPane1.setViewportView(jList1);

        add(jScrollPane1, java.awt.BorderLayout.WEST);

        jScrollPane2.setViewportView(jTextPane1);

        add(jScrollPane2, java.awt.BorderLayout.CENTER);
    }// </editor-fold>
    // Variables declaration - do not modify
    private javax.swing.JList jList1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextPane jTextPane1;
    // End of variables declaration

    @Override
    public void update(Observable o, Object arg) {
        LOG.info("trying to observe.." + arg);
        LOG.info(controller.getGroup());
        //update defaultListModel
    }
}

扩展Observe的对象从Controller.setGroup()中调用notifyObservers:

package net.bounceme.dur.usenet.controller;

import java.util.Observable;
import java.util.logging.Logger;

public class Controller extends Observable {

    private static final Logger LOG = Logger.getLogger(Controller.class.getName());
    private String group;
    private static Controller instance;

    protected Controller() {
    }

    public static Controller getInstance() {
        if (instance == null) {
            instance = new Controller();
        }
        return instance;
    }


    public void setGroup(String selectedValue) {
        group = selectedValue;
        LOG.fine(group);
        notifyObservers();
    }

    public String getGroup() {
        return group;
    }

}

也许ArticleSelect没有正确注册以观察控制器?

1 个答案:

答案 0 :(得分:5)

java.util.Observable#notifyObservers()

只有在update()将对象注册为已更改时,才会调用setChanged()方法。