Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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 值更改侦听器未启动_Java_Data Binding_Jface - Fatal编程技术网

Java 值更改侦听器未启动

Java 值更改侦听器未启动,java,data-binding,jface,Java,Data Binding,Jface,我试图在一个自定义(非swt非JFace)日期时间小部件上实现JFace数据绑定。这个小部件是由第三方从头制作的,我们在应用程序中使用它 我正在尝试向它添加数据绑定,它几乎可以工作,在这个意义上,当我创建绑定时,“fillInitialValue”方法确实能够将正确的日期放入小部件中,但是值更改侦听器不工作(其中的断点,根本不执行) 在ValueBinding类(org.eclipse.core.databinding)中,它确实添加了监听器 target.addValueChangeListe

我试图在一个自定义(非swt非JFace)日期时间小部件上实现JFace数据绑定。这个小部件是由第三方从头制作的,我们在应用程序中使用它

我正在尝试向它添加数据绑定,它几乎可以工作,在这个意义上,当我创建绑定时,“fillInitialValue”方法确实能够将正确的日期放入小部件中,但是值更改侦听器不工作(其中的断点,根本不执行)

在ValueBinding类(org.eclipse.core.databinding)中,它确实添加了监听器

target.addValueChangeListener(targetChangeListener);
其中目标是my
AbstractObserveValue
implementation(DateChooserObserver),侦听器是默认的侦听器

private IValueChangeListener targetChangeListener = new IValueChangeListener() {
    @Override
    public void handleValueChange(ValueChangeEvent event) {
        if (!updatingTarget
                && !Util.equals(event.diff.getOldValue(), event.diff
                        .getNewValue())) {
            doUpdate(target, model, targetToModel, false, false);
        }
    }
};
这是我的目标观察者:

public class DateChooserObserver extends AbstractObservableValue<Date> {

    private DateChooserCombo widget;

    public DateChooserObserver(DateChooserCombo widget) {
        super();
        this.widget = widget;
    }

    @Override
    public Object getValueType() {
        return Date.class;
    }

    @Override
    protected Date doGetValue() {
        return widget.getValue();
    }

    @Override
    protected void doSetValue(Date value) {
        widget.setValue(value);
    }

}
公共类DateChooseSerobserver扩展了AbstractObserveValue{
私有日期选择器组合小部件;
公共DateChooserObserver(DateChooseCombo小部件){
超级();
this.widget=widget;
}
@凌驾
公共对象getValueType(){
返回日期.class;
}
@凌驾
受保护日期doGetValue(){
返回widget.getValue();
}
@凌驾
受保护的无效剂量值(日期值){
widget.setValue(值);
}
}
我唯一能想到的是,我可能需要(以某种方式)在实际日期字段而不是小部件上放置一个值更改观察者,但我不确定如何放置

我不知道为什么它不起作用。我拥有的两个转换器(convert attribute to widget和widget to attribute)最初都会启动,但正如我所说,侦听器没有检测到小部件(或者小部件本身,我不知道)的
java.util.date
字段中的更改当我选择一个新日期时,convert小部件to属性没有被执行。

为了避免被执行,我将提交所有这些的解决方案

第一件事:我没有完全访问我们正在使用的小部件,因此我无法实现“正确”的实现,但我确实找到了解决办法:

AbstractObservalEvalue类有一个可以重写的
addValueChangeListener(ValueChangeListener)
方法。这使您可以直接访问侦听器,并且可以强制激活它的“handleEvent”方法

我现在没有实际的代码,我希望我不会忘记下周一更新这个答案,但解决方案是这样的:

public class DateChooserObserver extends AbstractObservableValue<Date> {

    ...

    @Override
    public void setValueChangeListener(ValueChangeListener listener) {
        super.setValueChangeListener(listener);
        widget.getText().addModifyListener(e -> {
            listener.handleEvent(new ValueChangeEvent(this, getDummyDiff();
        });
    }

    // returns a diff with different dates to always evaluate true in doUpdate()
    public ValueDiff<Date> getDummyDiff() {
        return new ValueDiff() {

            @Override
            public Date getOldValue() {
                return new Date(1,1,1);
            }

            @Override
            public Date getNewValue() {
                return new Date(1,1,2);
            }
        }

    }
公共类DateChooseSerobserver扩展了AbstractObserveValue{
...
@凌驾
public void setValueChangeListener(ValueChangeListener listener){
super.setValueChangeListener(监听器);
widget.getText().addModifyListener(e->{
handleEvent(新的ValueChangeEvent(this,getDummyDiff();
});
}
//返回具有不同日期的差异,以便在doUpdate()中始终计算true
公共价值差异getDummyDiff(){
返回新的ValueDiff(){
@凌驾
公共日期getOldValue(){
返回新日期(1,1,1);
}
@凌驾
公共日期getNewValue(){
返回新日期(1,1,2);
}
}
}
升级是在diff中给出实际的旧/新日期,因为如果日期没有更改,它会尝试不进行更新,但我无法获得它们,因此“始终正确”的diff是我唯一的解决方案

DR,有一个监听器,监听器做一些事情,但是如果您没有兼容的小部件或访问小部件的内部工作,您需要强制该监听器处理事件

另外,我不确定
doUpdate()
是否是数据绑定中方法的名称,只是一个占位符,与任何方式都没有什么关联