Méthode appropriée pour lier un groupe de boutons radio à l'aide de la liaison de données JFace
Je me demandais si quelqu'un pourrait m'expliquer comment je pourrait la lier à un groupe de boutons radio pour une variable booléenne dans le modèle à l'aide de JFace la liaison de données.
Laissez-moi vous expliquer la situation: j'ai créé une classe qui représente un groupe de SWT boutons (avec le style de 'SWT.La RADIO") qui se compose de trois éléments: Une étiquette avec la question et les deux boutons, l'un pour la réponse "oui" et un pour un "non". Je voudrais créer une liaison à une variable booléenne dans le modèle de telle manière que lorsqu'un utilisateur sélectionne le "oui" bouton radio le booléen est vrai, et quand il/elle sélectionne le bouton "non" le booléen est définie sur false.
Voici le code de ma classe:
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;
}
}
Maintenant, comme vous pouvez le voir, je suis à la liaison de mon bouton "oui" pour la valeur de type boolean. Plus précisément, la valeur sera lié sur la SWT.sélection de l'événement. C'est, paraît-il, le seul événement valide pour la liaison d'un bouton radio. Cependant, à cause de cela, une fois que le bouton "non" est sélectionné, la valeur de ce booléen reste inchangée (puisque pas de SWT.sélection d'événements sur le bouton "oui" a été tiré).
Que puis-je faire pour que cela fonctionne, la façon dont il est censé le faire, c'est à dire être en mesure de modifier la valeur du booléen dans le modèle sur la base duquel des boutons que l'utilisateur sélectionne?
Ai-je raté quelque chose d'évident ici?
Merci!
source d'informationauteur Sandman
Vous devez vous connecter pour publier un commentaire.
Il semble similaire à la liaison d'un POJO à une propriété.
Cela signifie que vous devez avoir un objet avec les deux boutons de la mise en œuvre d'un IObservablepuis le lier à votre propriété.
Comme vous l'avez mentionné dans les commentaires, vous devez étendre AbstractObservable.
Vous avez un exemple d'une telle extension ici, dans cette classe de Test sur une observable liste (pas nécessaire à ce que vous avez besoin, mais il peut vous donner des idées au sujet de l'utilisation de l'observer lorsqu'il s'agit de détecter le changement dès la notification)
Je crois que j'ai trouvé la manière la plus adéquate de la mise en œuvre de cette.
Vous devez utiliser le org.eclipse.de base.la liaison de données.observables.de la valeur.SelectObservableValue.
voici le code
Cela fonctionne bien pour al genre d'énumérations ou d'autres types de choix de valeurs. Vous pouvez bien sûr utiliser vous Chaîne OUI et NON, mais je préfère les énumérations
Si vous utiliser le Nébuleuse Groupe De Boutons de contrôle que vous pouvez utiliser RadioGroupViewer et lier la visionneuse de sélection comme n'importe quel autre observateur par exemple ComboViewer
Les boutons de la radio au sein de la même composite serait agir en tant que groupe, par conséquent, un seul bouton ont une vraie valeur, et tous les autres devraient avoir une valeur fausse. Avec ce fait, la observeSelection sur Oui Bouton devrait être suffisant pour refléter la valeur sélectionnée de oui ou de non, le modèle de propriété.
Ou en d'autres termes, le constructeur modifié devrait ressembler à ceci.
J'ai essayé et trouvé de travail. Il suffit de cocher.
C'est ce que j'ai lors du mappage des boutons radio pour enum (je vais procéder et de le rendre réutilisable dans notre projet) - à l'aide de ISWTObservableValue évite d'ajouter les auditeurs:
Cela devrait fonctionner avec peu ou pas d'effort, et nous savons tous que c'est la meilleure sorte de droit de réponse?