PropertyChangeSupport已触发事件未到达

时间:2011-12-13 12:13:50

标签: java model-view-controller events

首先,我有一个名为rit(ride)的模型类,它扩展了AbstractModel。 我还有一个AbstractController。

该模型应该触发abstractcontroller应该处理的属性更改。事件被正确触发,但它没有被控制器捕获。

我有以下代码:

public abstract class AbstractModel {

/**
 * Convenience class that allow others to observe changes to the model properties
 */
protected PropertyChangeSupport propertyChangeSupport;

/**
 * Default constructor. Instantiates the PropertyChangeSupport class.
 */
public AbstractModel() {
    propertyChangeSupport = new PropertyChangeSupport(this);
}

/**
 * Adds a property change listener to the observer list.
 * @param l The property change listener
 */
public void addPropertyChangeListener(PropertyChangeListener l) {
    propertyChangeSupport.addPropertyChangeListener(l);
}
/**
 * Fires an event to all registered listeners informing them that a property in
 * this model has changed.
 * @param propertyName The name of the property
 * @param oldValue The previous value of the property before the change
 * @param newValue The new property value after the change
 */
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
    PropertyChangeListener[] listener = propertyChangeSupport.getPropertyChangeListeners();


    propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
}
}

public class RitAanvraagController extends AbstractController {

//  Properties this controller expects to be stored in one or more registered models

public static final String RITAANVRAAG_WACHTRIJ_PROPERTY = "Ritaanvraag";

/**
 * Voeg een ritaanvraag toe aan het model
 * @param ritAanvraag de nieuwe rit aanvraag.
 */
public void nieuwRitaanvraag(RitAanvraagModel ritAanvraag) {
    alterModelProperty("add", RITAANVRAAG_WACHTRIJ_PROPERTY, ritAanvraag);
}
}

package com.itopia.railcabserver.controller;

public abstract class AbstractController implements PropertyChangeListener {

//  Vectors that hold a list of the registered models and views for this controller.
private ArrayList<AbstractViewPanel> registeredViews;
private ArrayList<AbstractModel> registeredModels;

/** Creates a new instance of Controller */
public AbstractController() {
    registeredViews = new ArrayList<AbstractViewPanel>();
    registeredModels = new ArrayList<AbstractModel>();
}

/**
 * Binds a model to this controller. Once added, the controller will listen for all 
 * model property changes and propogate them on to registered views. In addition,
 * it is also responsible for resetting the model properties when a view changes
 * state.
 * @param model The model to be added
 */
public void addModel(AbstractModel model) {
    registeredModels.add(model);
    model.addPropertyChangeListener(this);
}


public void propertyChange(PropertyChangeEvent evt) {

    for (AbstractViewPanel view : registeredViews) {
        view.modelPropertyChange(evt);
    }
}
}

方法propertyChange永远不会在abstractcontroller中,永远不会被触发。

但是当我解雇这个:propertyChangeSupport.firePropertyChange(propertyName,oldValue,newValue);在abstractmodel中,propertychange永远不会在abstractcontroller中被触发。不是当我向控制台打印东西时,也不是当我设置断点时。 当我在方法propertyChangeSupport.firePropertyChange(propertyName,oldValue,newValue)上调试并设置断点时; PropertyChangeListener []侦听器确实包含ritAanvraagController。所以它应该被触发,然后由abstractcontroller处理。

我希望有人看到我的错误,可以帮助我。

亲切的问候, Rikkert

0 个答案:

没有答案