Привязка данных Java JFace: обновление виджета SWT из фонового потока - PullRequest
1 голос
/ 28 февраля 2012

Фоновый поток должен обновить простое поле ввода текста с некоторым значением.

Я заранее создал POJO с getter / setter, назвал мастера привязки данных JFACE, чтобы сгенерировать оболочку и позволить ей сгенерировать код.

Я полностью полагаюсь на сгенерированный код, просто добавил встроенный поток, который устанавливает данные значения, вызывая установщик.

Хотя он отлично работает от пользовательского интерфейса до POJO данных,наоборот, никак.

Я попробовал POJO, а также бины, применяющие PropertyChangeSupport и firePropertyChange (), никак.

Может, кто-нибудь прояснит это или укажет на некоторые ресурсы в Интернете?(Конечно, я гуглил и применил поиск здесь ...)

(Для простоты я изменил некоторые элементы на «статические» в этом примере, а также пропустил некоторую правильную обработку потоков.)

ЛучшийС уважением Герд

Код:

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

Ответы [ 2 ]

1 голос
/ 20 сентября 2012

PojoObservable - это простая оболочка вокруг POJO для использования их в привязках данных. У них нет возможности проверить, изменилось ли одно из их свойств, поэтому они никак не могут изменить пользовательский интерфейс в ответ на изменение своего внутреннего состояния.

0 голосов
/ 05 января 2018

Используйте

BeanProperties.value(myDataClass, "myString");

Вместо

PojoObservables.observeValue(myDataClass, "myString");

И ваш метод установки бинов должен вызывать fireProperyChage(....)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...