我想知道是否有人可以向我解释如何使用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; } }
现在,正如您所看到的,我将我的"是"按钮绑定到布尔值.具体来说,该值将绑定在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")); }
这当然适用于各种枚举或其他类型的可选值.你当然可以使用String YES和NO,但我更喜欢枚举