バックグラウンドスレッドは、単純なテキスト入力フィールドをある値で更新するものとします。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;
}
}
を呼び出す必要があり、POJOのデータ連結のポイントは何ですか? TARGETからMODELへの変換のみを制御するには? DataBindingContextのupdateTargets()はUIの更新を強制的に強制するべきではありませんか?それは動作しません... :-\ – marcolopes