【问题标题】:Eclipse RCP Data Binding with WritableValue - Int vs. IntegerEclipse RCP 数据绑定与 WritableValue - Int 与 Integer
【发布时间】:2014-05-14 12:48:17
【问题描述】:

我正在使用 Eclipse RCP 4,我的 WritableValue 没有什么问题:

我在数据绑定中使用WritableValue(见下文),每当我将WritableValue 的值设置为包含int 属性(绑定的一部分)的对象时,我都会收到ClassCastException

Caused by: java.lang.ClassCastException: Cannot cast java.lang.Integer to int
 at java.lang.Class.cast(Unknown Source)
 at org.eclipse.core.internal.databinding.beans.PojoValueProperty.doGetValue(PojoValueProperty.java:62)
 at org.eclipse.core.databinding.property.value.ValueProperty.getValue(ValueProperty.java:60)
 at org.eclipse.core.internal.databinding.property.value.SimplePropertyObservableValue.notifyIfChanged(SimplePropertyObservableValue.java:119)
 at org.eclipse.core.internal.databinding.property.value.SimplePropertyObservableValue.doGetValue(SimplePropertyObservableValue.java:101)
 at org.eclipse.core.databinding.observable.value.AbstractObservableValue.getValue(AbstractObservableValue.java:81)
 at org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableValue.doGetValue(DetailObservableValue.java:150)
 at org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableValue$2.handleValueChange(DetailObservableValue.java:96)
 at org.eclipse.core.databinding.observable.value.ValueChangeEvent.dispatch(ValueChangeEvent.java:71)
 at org.eclipse.core.databinding.observable.ChangeManager.fireEvent(ChangeManager.java:127)
 at org.eclipse.core.databinding.observable.value.AbstractObservableValue.fireValueChange(AbstractObservableValue.java:76)
 at org.eclipse.core.databinding.observable.value.WritableValue.doSetValue(WritableValue.java:94)
 at org.eclipse.core.databinding.observable.value.AbstractObservableValue.setValue(AbstractObservableValue.java:60)

这是我的绑定:

IObservableValue<?> model2 = PojoProperties.value(PlantBE.class,
            "maxAge").observeDetail(getModel().getWritableValue());
ISWTObservableValue<String> view2 = WidgetProperties.textText(SWT.Modify)
            .observe(getDialogView().getTxtMaxAge().getText());
this.getDataBindingContext().bindValue(model2, view2);

实体 (PlantBE) 看起来像这样:

public class PlantBE implements Serializable {
private int maxAge;

public int getMaxAge() {
    return maxAge;
}

public void setMaxAge(int maxAge) {
    this.maxAge = maxAge;
}
}

在这方面获得一些帮助会很棒。也许你知道问题可能是什么。

感谢和问候

【问题讨论】:

    标签: java data-binding eclipse-rcp


    【解决方案1】:

    getModel().getWritableValue() 返回什么?你为什么不这样做:

    IObservableValue model= BeanProperties.value(PlantBE.class,"maxAge").observe(model);
    IObservableValue view = WidgetProperties.text(SWT.Modify).observe(getDialogView().getTxtMaxAge());
    this.getDataBindingContext().bindValue(model, view);
    

    另外,看看this holy Eclipse RCP grail, aka Vogella's tutorial,它应该可以帮助你理解整个数据绑定的混乱。

    【讨论】:

    • 感谢您的回答。虽然这不是我的问题。我试着给你一些更多的细节:getModel()getWritableValue() 返回一个 WritableValue,PlantBE 中的属性“maxAge”应该被绑定(比较上面的代码)。我不能使用 BeanProperties,因为 PlantBE 不是 bean。尽管我也尝试过 BeanProperties 并且它正在工作,但显然我得到了一些例外,即某些方法丢失了。感谢您的链接,但我已经不止一次地研究过它;)并且 WritableValues 是一个小话题。
    • 不确定,“PlantBE 不是 bean”是什么意思,因为它足以让 class 成为 pojo。此外,您可以检查它抱怨哪些方法。根据您的实现,另一个明显的解决方案是将 maxAge 的类型从 int 更改为 Integer。
    • 这是一个 Bean:Java Bean 是遵循 Java Bean 规范的 Java 对象。该规范要求该类为其所有属性实现 getter 和 setter 方法。它还必须通过 PropertyChangeSupport 类实现属性更改支持并将更改传播到已注册的侦听器。 (Vogella) 遗憾的是 maxAge 不能更改为整数。
    猜你喜欢
    • 2012-02-05
    • 2013-01-18
    • 2011-04-29
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    相关资源
    最近更新 更多