2012-02-28 13 views
1

バックグラウンドスレッドは、単純なテキスト入力フィールドをある値で更新するものとします。Java JFaceデータバインディング:バックグラウンドスレッドからSWTウィジェットを更新する

事前にgetter/setterを使用してPOJOを作成しました.JFACEデータバインドウィザードを使用してシェルを生成し、コードを生成させました。

私は、生成されたコードに完全に依存しています。setterを呼び出して値のデータを設定するインラインスレッドが追加されました。

UIからデータPOJOまで完璧に機能していますが、それ以外の方法はありません。

私はPOJOだけでなく、PropertyChangeSupportとfirePropertyChange()を適用するBeanも試みました。

誰かがこれを照らすことができますか、いくつかのウェブリソースを指摘できますか?

(簡単にするためには、私は、このサンプルにも省略さいくつかの適切なスレッド処理で「静的」にいくつかの要素を変更しました。)(確かに私が... Googleで検索してここに検索を適用)

敬具 ゲルト

コード:

public class Gui extends Shell { 

private DataBindingContext m_bindingContext; 
private static com.gsi.MyDataClass myDataClass = new com.gsi.MyDataClass(); 
private Text myStringText; 

/** 
* Launch the application. 
* @param args 
*/ 
public static void main(String args[]) { 
    Display display = new Display(); 
    Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() { 
     public void run() { 
      try { 
       Display display = Display.getDefault(); 
       Gui shell = new Gui(display, SWT.SHELL_TRIM); 
       shell.open(); 
       shell.layout(); 
       // here is the thread ----------------------------------------- 
       new Thread() { 

        public void run() { 
         while (true) { 
          try { Thread.sleep(1000); } catch (InterruptedException e) { }       
          myDataClass.setMyString("Date1:" + new Date().toString()); 
         } 
        } 
       } .start(); 
       // the rest is generated code ------------------------------------------------------------ 

       while (!shell.isDisposed()) { if (!display.readAndDispatch()) { 
         display.sleep();      } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the shell. 
* @param display 
* @param style 
*/ 
public Gui(Display display, int style) { 
    super(display, style); 
    createContents(); 
} 

/** 
* Create contents of the window. 
*/ 
protected void createContents() { 
    setText("SWT Application"); 
    setSize(242, 99); 
    setLayout(new GridLayout(2, false)); 

    new Label(this, SWT.NONE).setText("MyString:"); 

    myStringText = new Text(this, SWT.BORDER | SWT.SINGLE); 
    myStringText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, 
      false)); 

    if (myDataClass != null) { 
     m_bindingContext = initDataBindings(); 
    } 
} 

@Override 
protected void checkSubclass() { 
    // Disable the check that prevents subclassing of SWT components 
} 

public com.gsi.MyDataClass getMyDataClass() { 
    return myDataClass; 
} 

public void setMyDataClass(com.gsi.MyDataClass newMyDataClass) { 
    setMyDataClass(newMyDataClass, true); 
} 

public void setMyDataClass(com.gsi.MyDataClass newMyDataClass, 
     boolean update) { 
    myDataClass = newMyDataClass; 
    if (update) { 
     if (m_bindingContext != null) { 
      m_bindingContext.dispose(); 
      m_bindingContext = null; 
     } 
     if (myDataClass != null) { 
      m_bindingContext = initDataBindings(); 
     } 
    } 
} 
protected DataBindingContext initDataBindings() { 

    DataBindingContext bindingContext = new DataBindingContext(); 
    // 
    IObservableValue myStringObserveWidget = SWTObservables.observeText(myStringText, SWT.Modify); 
    IObservableValue myStringObserveValue = PojoObservables.observeValue(myDataClass, "myString"); 
    bindingContext.bindValue(myStringObserveWidget, myStringObserveValue, null, null); 

    // bindingContext.bindValue(myStringObserveWidget, myStringObserveValue, 
     // new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE), new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE)); 
    // 
    return bindingContext; 
} 
} 

答えて

1

PojoObservableは、データバインディングでそれらを使用するPOJOの周りのシンプルなラップです。彼らはそのプロパティの1つが変化するかどうかをチェックする方法がないので、内部状態の変化に応じてUIを変更する方法はありません。

+0

を呼び出す必要があり、POJOのデータ連結のポイントは何ですか? TARGETからMODELへの変換のみを制御するには? DataBindingContextのupdateTargets()はUIの更新を強制的に強制するべきではありませんか?それは動作しません... :-\ – marcolopes

0

使用する代わりに

PojoObservables.observeValue(myDataClass, "myString"); 

BeanProperties.value(myDataClass, "myString");

そして、あなたの豆セッターメソッドだからfireProperyChage(....)

関連する問題