2009-03-16 8 views
11

JFaceデータバインディングを使用して、ラジオボタンのグループをモデルのブール変数に適切にバインドする方法を誰かに説明できますか?JFaceデータバインディングを使用してラジオボタングループをバインドする適切な方法

最初に状況を説明しましょう:3つの要素で構成されるSWTボタンのグループ(SWT.RADIOに設定されたスタイル)を表すクラスを作成しました。質問付きのラベルと2つのボタン1つは「はい」、もう1つは「いいえ」です。私は、ユーザが "yes"ラジオボタンを選択したときにブール値がtrueに設定され、 "no"ボタンを選択するとブール値が真となるようにブール変数へのバインディングを作成したい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; 
}  


} 

はここに私のクラスのコードです。具体的には、値はSWT.selectionイベントにバインドされます。これは、ラジオボタンのバインディングの唯一の有効なイベントです。しかし、このため、「いいえ」ボタンが選択されると、ブール値の値は変更されません(「はい」ボタンのSWT.selectionイベントが発生しないため)。
この作業は、ユーザーが選択するボタンに基づいてモデル内のブール値を変更できるようにするためには何ができますか? 私はここで何かを見逃していますか? ありがとう!

答えて

7

binding a POJO to a propertyと似ています。

つまり、1つのオブジェクトにIObservableを実装する2つのボタンを実装し、それをプロパティにバインドする必要があります。
コメントに記載されているとおり、AbstractObservableを拡張する必要があります。

あなたが観察リストについて、このような拡張here with this class Testの例持って(あなたが必要なものを必要はありませんが、それは、通知の際に変更を検出するために来るとき、それはあなたに観察可能の使用についてのアイデアを与えることができます)

+0

はい、これはこの問題を解決する最もエレガントな方法のようです。答えがTnxの場合は、誰も何も良いことがなければそれを受け入れます。 Btw、私はおそらく、IObservableを直接実装するのではなく、AbstractObservableを拡張する必要があるようです。 – Sandman

+0

私はSeB.FrがSelectObservableValueを使用してより洗練された簡単なソリューションを提供したと思います。 – janhink

+1

@eQui私は同意し、その投稿をupvotedしています。 – VonC

2

ラジオ同じコンポジット内のボタンはグループとして機能するため、1つのボタンだけが真の値を持ち、他のすべてのボタンは偽の値を持つ必要があります。この事実に加えて、YesボタンのobserveSelectionはモデルプロパティの側でyesまたはnoの選択値を反映するのに十分なはずです。

つまり、変更されたコンストラクタは次のようになります。

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コントロールを使用する場合は、RadioGroupViewerを使用して、他のビューアと同様にビューアの選択をバインドできます。 ComboViewer

0

これは私が(私は進み、私たちのプロジェクトでは、それが再利用可能になります)列挙にラジオボタンをマッピングするときになってしまったものです - 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); 
6

私は思います私はこのために最も適切な実装を見つけました。 org.eclipse.core.databinding.observable.value.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")); 
    } 

です。もちろん、あなたはString YESとNOを使用することができますが、enumを好む

+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)); 
} 
関連する問題