【问题标题】:Java JFace databinding: Update SWT widget from background threadJava JFace 数据绑定:从后台线程更新 SWT 小部件
【发布时间】:2012-02-28 09:44:03
【问题描述】:

后台线程应该用一些值更新一个简单的文本输入字段。

我提前用getter/setter创建了POJO,调用JFACE数据绑​​定向导生成shell,让它生成代码。

我完全依赖生成的代码,只是添加了一个内联线程,通过调用setter来设置值数据。

虽然它从 UI 到数据 POJO 都可以完美运行,但反过来,没办法。

我尝试了 POJO 以及应用 PropertyChangeSupport 和 firePropertyChange() 的 bean,没办法。

请有人对此有所了解或指出一些网络资源吗? (当然我在这里用谷歌搜索并应用了搜索......)

(为简单起见,我在此示例中将一些元素更改为“静态”,并省略了一些适当的线程处理。)

最好的问候 格尔德

代码:

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

【问题讨论】:

    标签: java multithreading data-binding jface


    【解决方案1】:

    PojoObservable 是 POJO 的简单包装,可在数据绑定中使用它们。他们无法检查其中一项属性是否发生变化,因此他们无法更改 UI 以响应其内部状态的变化。

    【讨论】:

    • 那么,POJO 数据绑定的意义何在?要控制 TARGET 到 MODEL 的转换,只有?不应该使用 DataBindingContext 中的 updateTargets() 来“强制”更新 UI 吗?它不起作用... :-\
    【解决方案2】:

    使用

    BeanProperties.value(myDataClass, "myString");

    代替

    PojoObservables.observeValue(myDataClass, "myString");
    

    而且你的bean setter方法必须调用fireProperyChage(....)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 2016-06-02
      • 2015-12-16
      相关资源
      最近更新 更多