الطريقة الصحيحة لربط زر الراديو المجموعة باستخدام JFace ربط البيانات

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

سؤال

أنا أتساءل عما إذا كان أي شخص يمكن أن تفسر لي كيف يمكن أن بشكل صحيح ربط مجموعة من أزرار الراديو إلى متغير منطقية في نموذج باستخدام JFace ربط البيانات.

اسمحوا لي أن أشرح الحالة الأولى:لقد خلق الفئة التي تمثل مجموعة من ع الأزرار (مع نمط تعيين سبحانه وتعالى.راديو') التي تتكون من ثلاثة عناصر:التسمية مع السؤال و زرين واحد جواب "نعم" واحدة "لا".وأود أن إنشاء ملزمة متغير منطقية في النموذج في مثل هذه الطريقة التي عندما يختار المستخدم "نعم" زر الراديو منطقية تعيين إلى 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;
}    


}

الآن كما ترون أنا ملزم بلدي "نعم" زر منطقية.وعلى وجه التحديد ، فإن القيمة ستكون ملزمة بشأن سبحانه وتعالى.اختيار الحدث.هذا ما يبدو فقط صالحة الحدث لربط زر الراديو.ومع ذلك ، وبسبب هذا ، مرة واحدة على زر "لا" يتم تحديد قيمة منطقية لم يتغير (لأنه لا وتعالى.اختيار الحدث على زر "نعم" أطلق).
ما الذي يمكنني القيام به لجعل هذا العمل بالطريقة التي من المفترض أن ، أيأن تكون قادرة على تغيير قيمة منطقية في نموذج يستند إلى أي من أزرار المستخدم يختار?أنا في عداد المفقودين شيء واضح هنا ؟ وذلك بفضل!

هل كانت مفيدة؟

المحلول

يبدو مشابهة ملزمة POJO إلى خاصية.

هذا يعني أنك يجب أن يكون كائن واحد مع اثنين من الأزرار تنفيذ IObservable, ثم ربط على الممتلكات الخاصة بك.
كما ذكر في التعليقات ، يجب أن تمتد AbstractObservable.

لديك مثال على مثل هذا التمديد هنا مع هذه الفئة الاختبار عن ملاحظتها قائمة (ليس من الضروري ما تحتاج ولكن يمكن أن تعطيك أفكارا حول استخدام ملاحظتها عندما يتعلق الأمر إلى الكشف عن تغيير بناء على إخطار)

نصائح أخرى

أعتقد أنني وجدت معظم المناسبة لتنفيذ هذا.تحتاج إلى استخدام org.الكسوف.الأساسية.ربط البيانات.يمكن ملاحظتها.القيمة.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"));
    }

يعمل هذا بالطبع عن نوع enums أو نوع آخر من اختيار القيم.يمكنك بالطبع استخدام سلسلة نعم و لا, ولكن أنا أفضل enums

إذا كنت تستخدم سيطرة سديم RadioGroup يمكنك استخدام RadioGroupViewer وربط اختيار المشاهد مثل أي مشاهد مثل الآخرين ComboViewer

وأزرار الراديو في نفس المركب ستعمل كمجموعة، وبالتالي، فإن زر واحد فقط يكون لها قيمة حقيقية، وجميع الآخرين يجب أن يكون قيمة خاطئة. جنبا إلى جنب مع هذه الحقيقة، يجب أن يكون observeSelection على زر نعم كافية لتعكس القيمة المحددة من نعم أو لا، إلى جانب خاصية النموذج.

وأو بعبارة أخرى، فإن المنشئ المعدلة تبدو هذه.

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

وحاولت ذلك وجدت تعمل بشكل جيد. انظروا فقط إلى.

وهذا هو ما انتهى إليه عند تعيين أزرار الراديو لتعداد (I ستمضي قدما وجعلها قابلة لإعادة الاستخدام في مشروعنا) - باستخدام ISWTObservableValue يوفر الجهد إضافة المستمعين:

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

وهذا يجب أن تعمل مع أي جهد يذكر ل، ونحن نعلم جميعا أن هذا هو أفضل نوع من الإجابة أليس كذلك؟

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));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top