首先,我有一个名为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