2012-02-28 76 views
1

后台线程应更新具有某个值的简单文本输入字段。Java JFace数据绑定:从后台线程更新SWT小部件

我使用getter/setter预先创建了POJO,称为JFACE数据绑​​定向导来生成一个shell并让它生成代码。

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

虽然它从UI到数据POJO完美工作,但反过来,没有办法。

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

可以请某人澄清这一点或指向一些网络资源? (当然,我一派,在这里应用搜索...)

(为简单起见,我这个样本以及ommitted一些适当的线程处理中改变了一些元素,以“静态”。)

问候 格尔德

代码:

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简单的包裹在数据绑定使用它们。他们没有办法检查他们的一个属性是否改变,所以他们没有办法改变UI以响应其内部状态的改变。

+0

那么,什么是POJO数据绑定的意义呢?要控制TARGET到MODEL的转换,只有?不应该使用DataBindingContext中的updateTargets()来“强制”UI更新吗?这是行不通的... :-\ – marcolopes 2015-01-25 19:25:05

0

使用

BeanProperties.value(myDataClass, "myString");

而不是

PojoObservables.observeValue(myDataClass, "myString"); 

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