Java PropertyChangeSupport触发的事件未到达
首先,我有一个名为rit(ride)的模型类,它扩展了抽象模型。 我还有一个抽象控制器 模型应该触发abstractcontroller应该处理的属性更改。事件已正确触发,但控制器未捕获该事件 我有以下代码:Java PropertyChangeSupport触发的事件未到达,java,model-view-controller,events,Java,Model View Controller,Events,首先,我有一个名为rit(ride)的模型类,它扩展了抽象模型。 我还有一个抽象控制器 模型应该触发abstractcontroller应该处理的属性更改。事件已正确触发,但控制器未捕获该事件 我有以下代码: public abstract class AbstractModel { /** * Convenience class that allow others to observe changes to the model properties */ protected Proper
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);
}
}
package com.itopia.railcabserver.controller;
公共抽象类AbstractController实现PropertyChangeListener{
//包含此控制器的已注册模型和视图列表的向量。
私有ArrayList注册视图;
私有ArrayList注册模型;
/**创建控制器的新实例*/
公共控制器(){
registeredViews=newarraylist();
registeredModels=newArrayList();
}
/**
*将模型绑定到此控制器。添加后,控制器将侦听所有
*对属性更改进行建模并将其发布到已注册的视图中。此外,
*它还负责在视图更改时重置模型属性
*国家。
*@param model要添加的模型
*/
公共模型(抽象模型){
registeredModels.add(model);
model.addPropertyChangeListener(此);
}
公共作废属性更改(属性更改事件evt){
for(AbstractViewPanel视图:registeredViews){
view.modelPropertyChange(evt);
}
}
}
方法propertyChange从不在abstractcontroller中,也从不激发
但是当我触发这个:propertyChangeSupport.firePropertyChange(propertyName、oldValue、newValue);在abstractmodel中,abstractcontroller中永远不会触发propertychange。不是在我将某些内容打印到控制台时,也不是在我设置断点时。
调试并在方法propertyChangeSupport.firePropertyChange(propertyName、oldValue、newValue)处设置断点时;
PropertyChangeListener[]侦听器确实包含ritAanvraagController。因此,它应该被激发,然后由abstractcontroller处理
我希望任何人都能看到我的错误,并能帮助我走出困境
亲切问候,,
RikkertfirePropertyChange仅在旧值与新值不同时触发事件。使用调试器查看它是否真的触发事件,并按照方法调用查看事件发生了什么。
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);
}
}
}