Me preguntaba si alguien podría explicarme cómo podría vincular correctamente un grupo de botones de opción a una variable booleana en el modelo utilizando el enlace de datos JFace.Forma correcta de vincular un grupo de botones de radio utilizando el enlace de datos JFace
Déjenme explicar la situación primero: he creado una clase que representa un grupo de botones SWT (con el estilo establecido en 'SWT.RADIO') que consta de tres elementos: una etiqueta con la pregunta y dos botones , uno para la respuesta "sí" y otro para un "no". Me gustaría crear un enlace a una variable booleana en el modelo de tal manera que cuando un usuario seleccione el botón de opción "sí", el booleano se establezca en verdadero, y cuando seleccione el botón "no", el booleano sea establecer en falso
Aquí está el código de mi clase:
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;
}
}
Ahora, como se puede ver, estoy mi botón "sí" a la unión booleana. Específicamente, el valor se vinculará en el evento SWT.selection. Este es, al parecer, el único evento válido para el enlace de un botón de opción. Sin embargo, debido a esto, una vez que se selecciona el botón "no", el valor de boolean permanece sin cambios (ya que no se activó ningún evento SWT.selection en el botón "sí").
¿Qué puedo hacer para que esto funcione como se supone que debe, es decir, para poder cambiar el valor del booleano en el modelo en función de cuál de los botones selecciona el usuario? ¿Me estoy perdiendo algo obvio aquí? Gracias!
Hmmm ... sí, esta parece ser la forma más elegante de resolver este problema. Tnx por la respuesta, la aceptaré si a nadie se le ocurre algo mejor. Por cierto, parece que probablemente debería extender AbstractObservable en lugar de implementar IObservable directamente. – Sandman
Creo que SeB.Fr proporcionó una solución aún más elegante y simple usando SelectObservableValue. – janhink
@eQui Estoy de acuerdo, y he votado a favor esa publicación. – VonC