San*_*man 11 data-binding swt jface eclipse-rcp
我想知道是否有人可以向我解释如何使用JFace数据绑定将一组单选按钮正确绑定到模型中的布尔变量.
让我先解释一下情况:我创建了一个代表一组SWT按钮的类(样式设置为'SWT.RADIO'),它由三个元素组成:带有问题的标签和两个按钮,一个用于"是"回答,一个回答"否".我想在模型中创建一个布尔变量的绑定,这样当用户选择"是"单选按钮时,布尔值设置为true,当他/她选择"否"按钮时,布尔值为设为false.
这是我班级的代码:
private class YesOrNoRadioButtonGroup {
private static final String YES = "yes";
private static final String NO = "no";
private Button m_yesButton;
private Button m_noButton;
public YesOrNoRadioButtonGroup(final Composite p_parent,
final String p_questionText,
final IObservableValue p_modelProperty
final DataBindingContext p_dbContext)
{
Composite radioButtonGroupContainer = new Composite(p_parent, SWT.NONE);
radioButtonGroupContainer.setLayout(new GridLayout());
Label question = new Label(radioButtonGroupContainer, SWT.NONE);
question.setText(p_questionText);
m_yesButton = new Button(radioButtonGroupContainer, SWT.RADIO);
m_yesButton.setText(YES);
m_noButton = new Button(radioButtonGroupContainer, SWT.RADIO);
m_noButton.setText(NO);
m_noButton.setSelection(true);
Listener yesOrNoRadioGroupListener = new Listener() {
public void handleEvent(Event p_event) {
Button button = (Button) p_event.widget;
if (m_yesButton.equals(button)) {
m_yesButton.setSelection(true);
m_noButton.setSelection(false);
}
else {
m_yesButton.setSelection(false);
m_noButton.setSelection(true);
}
}
};
m_yesButton.addListener(SWT.Selection, yesOrNoRadioGroupListener);
m_noButton.addListener(SWT.Selection, yesOrNoRadioGroupListener);
p_dbContext.bindValue(SWTObservables.observeSelection(this.getYesButton()),
p_modelProperty, null, null);
}
public Button getYesButton() {
return m_yesButton;
}
public Button getNoButton() {
return m_noButton;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,正如您所看到的,我将我的"是"按钮绑定到布尔值.具体来说,该值将绑定在SWT.selection事件上.这似乎是绑定单选按钮的唯一有效事件.但是,因此,一旦选择了"否"按钮,布尔值保持不变(因为"是"按钮上没有触发SWT.selection事件).
我该怎么做才能使它按照预期的方式工作,即能够根据用户选择的按钮更改模型中布尔值的值?我错过了一些明显的东西吗?谢谢!
它似乎类似于将POJO绑定到属性.
这意味着你应该有一个对象,你的两个按钮实现了一个IObservable,然后将它绑定到你的属性.
正如您在评论中提到的那样,您应该扩展AbstractObservable.
你有一个这样的扩展的例子,这个类有一个关于可观察列表的测试(不需要你需要的东西,但它可以给你关于在通知时检测变化时使用Observable的想法)
我想我找到了最合适的实现.您需要使用org.eclipse.core.databinding.observable.value.SelectObservableValue.这是代码
class YesNoModel{
public static enum RESPONSE {YES,NO};
private RESPONSE value;
public RESPONSE getValue(){return value;}
public void setValue(RESPONSE value){this.value = value;}
}
class YouGraphicalClass {
YesNoModel yesNomodel = new YesNoModel();
void iniDataBinding(){
IObservableValue yesBtnSelection = SWTObservables.observeSelection(this.getYesButton());
IObservableValue noBtnSelection = SWTObservables.observeSelection(this.getNoButton());
SelectObservableValue featureRepoPolicyObservable = new SelectObservableValue(YesNoModel.RESPONSE.class);
featureRepoPolicyObservable.addOption(RESPONSE.YES, yesBtnSelection);
featureRepoPolicyObservable.addOption(RESPONSE.NO, noBtnSelection);
p_dbContext.bindValue(featureRepoPolicyObservable,
PojoObservables.observeValue(yesNomodel, "value"));
}
Run Code Online (Sandbox Code Playgroud)
这当然适用于各种枚举或其他类型的可选值.你当然可以使用String YES和NO,但我更喜欢枚举