Richtige Art und Weise eine Auswahlknopfgruppe unter Verwendung von Daten zu binden JFace Bindungs

StackOverflow https://stackoverflow.com/questions/650959

Frage

Ich habe mich gefragt, ob jemand mich erklären könnte, wie ich richtig eine Gruppe von Optionsfeldern auf eine boolean Variable im Modell mit JFace Datenbindung binden könnte.

Lassen Sie mich erklären Sie die Situation zuerst: Ich habe eine Klasse erstellt, die eine Gruppe von SWT-Tasten (mit dem Stil ‚SWT.RADIO‘ gesetzt), die drei Elemente besteht aus darstellt: Ein Etikett mit der Frage und zwei Tasten, ein für die Antwort „ja“ und ein für ein „nein“. Ich möchte eine Bindung an eine boolean Variable im Modell so erstellen, dass, wenn ein Benutzer auf die Schaltfläche „Ja“ Radio wählt die boolean auf true gesetzt ist, und wenn er / sie die Schaltfläche „Nein“ der boolean auswählt auf false gesetzt.

Hier ist der Code meiner Klasse:

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;
}    


}

Nun, wie Sie sehen können, ich bin Bindung meine Schaltfläche „Ja“ auf die boolean. Insbesondere wird der Wert auf dem SWT.selection Ereignisse gebunden. Dies ist, wie es scheint, das einzige gültige Ereignis für die Bindung eines Radiobutton. Da jedoch diese, sobald die Schaltfläche „Nein“ ausgewählt ist, wird der Wert des Booleschen unverändert bleibt (da kein SWT.selection Ereignis auf der Schaltfläche „Ja“ gefeuert wurde).
Was kann ich tun, diese Arbeit den Weg zu machen, es soll, das heißt der Lage sein, den Wert der Booleschen im Modell wählt der Benutzer, welche der Tasten auf Basis zu ändern? Bin ich etwas fehlt hier offensichtlich? Dank!

War es hilfreich?

Lösung

Es scheint ähnlich href="http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg44044.html" rel="noreferrer"> Bindung eines POJO auf eine Eigenschaft .

Das bedeutet, dass Sie ein Objekt mit zwei Tasten Implementierung ein IObservable , und dann binden sie es zu Ihrem Eigentum.
Wie Sie in den Kommentaren erwähnt, sollten Sie eine href verlängern <= "http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/ eclipse / core / Datenbindung / beobachtbare / IObservable.html“rel = "noreferrer"> AbstractObservable .

Sie haben ein Beispiel für eine solche Erweiterung hier mit dieser Klasse-Test über eine beobachtbare Liste (nicht notwendig, was Sie brauchen, aber es kann Ihnen Ideen über die Verwendung von beobachtbaren geben, wenn es darum geht, die Änderung durch eine Benachrichtigung zu erkennen)

Andere Tipps

Ich glaube, ich die meisten sachgemäße Implementierung für diesen gefunden. Sie müssen die org.eclipse.core.databinding.observable.value.SelectObservableValue verwenden. hier ist der Code

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"));
    }

Das funktioniert natürlich auch für al Art von Aufzählungen oder anderer Art von wählbaren Werten. Sie könnten natürlich verwenden Sie String JA und NEIN, aber ich ziehe Aufzählungen

Sie Wenn verwenden Sie die Nebula Radiogroup Kontrolle Sie können RadioGroupViewer verwenden und binden die Zuschauerauswahl wie jeder andere Betrachter zB ComboViewer

Die Optionsfelder innerhalb des gleichen Verbund als Gruppe handeln würde daher nur eine Taste einen wahren Wert haben und alle anderen sollten einen falschen Wert haben. Zusammen mit dieser Tatsache sollte die observeSelection auf Ja-Knopf ausreichend sein, um den ausgewählten Wert von ja zu reflektieren oder nicht, auf der Modellseite Eigenschaft.

Oder mit anderen Worten, der modifizierte Konstruktor wie folgt aussehen würde.

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);
    p_dbContext.bindValue(SWTObservables.observeSelection(this.getYesButton()),
                p_modelProperty, null, null);   
}

Ich habe versucht, diese und fand gut funktioniert. Nur überprüfen.

Das ist, was ich am Ende mit, wenn Radio-Buttons Abbilden ENUM (ich werde gehen und es in unserem Projekt wiederverwendbar machen) - mit ISWTObservableValue spart sich die Mühe, die Zuhörer und fügte hinzu:

    final ISWTObservableValue upload = SWTObservables.observeSelection(btnUpload);
    final ISWTObservableValue download = SWTObservables.observeSelection(btnDownload);
    final ISWTObservableValue noTransfer = SWTObservables.observeSelection(btnNoTransfer);
    final IObservableValue btns = new ComputedValue(ExecutableTransferModes.class) {

        @Override
        protected void doSetValue(final Object value) {
            boolean u = false, d = false, n = false;
            switch ((ExecutableTransferModes) value) {
            case Upload:
                u = true;
                break;
            case Download:
                d = true;
                break;
            case Notransfer:
                n = true;
                break;
            }
            upload.setValue(u);
            download.setValue(d);
            noTransfer.setValue(n);
        }

        @Override
        protected Object calculate() {
            if (Boolean.TRUE.equals(upload.getValue())) {
                return ExecutableTransferModes.Upload;
            } else if (Boolean.TRUE.equals(download.getValue())) {
                return ExecutableTransferModes.Download;
            } else if (Boolean.TRUE.equals(noTransfer.getValue())) {
                return ExecutableTransferModes.Notransfer;
            } else {
                return null;
            }
        }
    };
    bindingContext.bindValue(btns, uploadProperty);

Dies sollte ohne viel Aufwand mit wenig Arbeit, und wir alle wissen, das ist die beste Art von Antwort richtig?

public static final void createAndBind(
    final DataBindingContext dbc, 
    final Composite parent,
    final Object bean, 
    final List<Object> options, 
    final String fieldName, 
    final Class<?> fieldType) {
    //
    List<Button> radios = new ArrayList<>();
    Button b;
    for (Object option : options) {
        b = new Button(parent, SWT.RADIO);
        b.setText(option.toString());
        b.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        radios.add(b);
    }
    //
    List<IObservableValue> iovs = new ArrayList<>();
    IObservableValue iov;
    for (Button radio : radios) {
        iov = SWTObservables.observeSelection(radio);
        iovs.add(iov);
    }
    SelectObservableValue observable = new SelectObservableValue(fieldType);
    //
    for (int i = 0; i < options.size(); i++) {
        observable.addOption(options.get(i), iovs.get(i));
    }
    //
    dbc.bindValue(observable, PojoObservables.observeValue(bean, fieldName));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top