2009-03-16 4 views
11

का उपयोग कर एक रेडियो बटन समूह को बांधने का सही तरीका मैं सोच रहा था कि कोई मुझे बता सकता है कि मैं जेएफएएस डेटा बाध्यकारी का उपयोग कर मॉडल में बूलियन चर के लिए रेडियो बटन के समूह को सही ढंग से कैसे बांध सकता हूं।जेएफएएस डेटा बाध्यकारी

मुझे पहले स्थिति की व्याख्या करने दें: मैंने एक वर्ग बनाया है जो एसडब्ल्यूटी बटनों के समूह का प्रतिनिधित्व करता है (शैली को 'SWT.RADIO' पर सेट किया गया है) जिसमें तीन तत्व होते हैं: प्रश्न वाला एक लेबल और दो बटन , एक "हां" उत्तर के लिए और एक "नहीं" के लिए एक। मैं इस मॉडल में एक बुलियन चर के लिए बाध्यकारी बनाना चाहता हूं कि जब कोई उपयोगकर्ता "हाँ" रेडियो बटन का चयन करता है तो बूलियन सत्य पर सेट होता है, और जब वह "नहीं" बटन चुनता है तो बूलियन है झूठ पर सेट करें। ,

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 ईवेंट निकाल दिया गया था)।
इस काम को जिस तरीके से माना जाता है, उसे बनाने के लिए मैं क्या कर सकता हूं, यानी उपयोगकर्ता द्वारा चुने गए बटनों के आधार पर मॉडल में बूलियन के मूल्य को बदलने में सक्षम होना चाहिए? क्या मुझे यहां कुछ स्पष्ट याद आ रही है? धन्यवाद!

उत्तर

7

यह binding a POJO to a property जैसा लगता है।

इसका मतलब है कि आपके पास IObservable को लागू करने वाले आपके दो बटनों के साथ एक ऑब्जेक्ट होना चाहिए, और फिर इसे अपनी संपत्ति से बांधें।
जैसा कि आप टिप्पणियों में उल्लेख करते हैं, आपको AbstractObservable का विस्तार करना चाहिए।

आप एक नमूदार सूची के बारे में इस तरह के एक विस्तार here with this class Test का एक उदाहरण है (आवश्यक नहीं है कि तुम क्या जरूरत है, लेकिन यह आप नमूदार के उपयोग के बारे में विचार दे सकते हैं जब यह सूचना पर परिवर्तन का पता लगाने के लिए आता है)

+0

हम्म ... हाँ, यह इस समस्या को हल करने का सबसे शानदार तरीका प्रतीत होता है। जवाब के लिए टीएनएक्स, अगर कोई भी बेहतर कुछ भी नहीं आता है तो मैं इसे स्वीकार करूंगा। बीटीडब्ल्यू, ऐसा लगता है कि मुझे शायद IObservable को लागू करने के बजाय सार तत्वों का विस्तार करना चाहिए। – Sandman

+0

मुझे लगता है कि SeB.Fr ने SelectObservableValue का उपयोग करके और भी सुरुचिपूर्ण और सरल समाधान प्रदान किया है। – janhink

+1

@ इक्कुई मैं सहमत हूं, और उस पोस्ट को ऊपर उठाया है। – VonC

2

रेडियो एक ही समग्र के भीतर बटन समूह के रूप में कार्य करेंगे, इसलिए, केवल एक बटन का वास्तविक मूल्य होगा और अन्य सभी के पास झूठा मूल्य होना चाहिए। इस तथ्य के साथ, मॉडल संपत्ति पक्ष में हाँ या नहीं के चयनित मूल्य को प्रतिबिंबित करने के लिए हां बटन पर निरीक्षण चयन पर्याप्त होना चाहिए।

या दूसरे शब्दों में, संशोधित कन्स्ट्रक्टर इस तरह दिखेगा।

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

मैंने कोशिश की और अच्छी तरह से काम कर पाया। बस जांचें।

2

यदि आप Nebula RadioGroup नियंत्रण का उपयोग करते हैं तो आप रेडियोग्रुप व्यूअर का उपयोग कर सकते हैं और किसी भी अन्य दर्शक जैसे दर्शक चयन को जोड़ सकते हैं उदा।

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

यह है कि मैं क्या जब रेडियो बटन मानचित्रण (मैं आगे बढ़ना है और यह हमारे परियोजना में पुन: प्रयोज्य कर देगा) Enum के साथ समाप्त हो गया है ISWTObservableValue का उपयोग कर श्रोताओं को जोड़ने की मेहनत से बच मुझे इसके लिए सबसे अधिक अपरिवर्तनीय कार्यान्वयन मिला। आपको org.eclipse.core.databinding.observable.value.SelectObservableValue का उपयोग करने की आवश्यकता है। यहाँ enums के अल प्रकार या चयन मूल्यों के अन्य प्रकार के लिए कोड

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

6

मुझे लगता है कि: - ComboViewer

+0

मुझे लगता है कि यह सबसे सुंदर समाधान है, धन्यवाद! – janhink

0

इसे कम से कम प्रयास करने के साथ काम करना चाहिए, और हम सभी जानते हैं कि यह सही प्रकार का उत्तर सही है?

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