Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PropertyChangeSupport触发的事件未到达_Java_Model View Controller_Events - Fatal编程技术网

Java PropertyChangeSupport触发的事件未到达

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

首先,我有一个名为rit(ride)的模型类,它扩展了抽象模型。 我还有一个抽象控制器

模型应该触发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);
}
}

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处理

我希望任何人都能看到我的错误,并能帮助我走出困境

亲切问候,,
Rikkert

firePropertyChange仅在旧值与新值不同时触发事件。使用调试器查看它是否真的触发事件,并按照方法调用查看事件发生了什么。
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);
    }
}
}