Слушатель изменения значения не запускается - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь реализовать привязку данных JFace в пользовательском (не SWT, не JFACE) виджете даты и времени.Виджет сделан с нуля третьей стороной, и мы используем его в нашем приложении.

Я пытаюсь добавить привязку данных к нему, и это почти работает, в том смысле, что когда я создаю привязку,Метод "fillInitialValue" действительно может поместить правильную дату в виджет, но слушатель изменения значения не работает (точка останова внутри него, вообще не выполняется).

В классе ValueBinding (org.eclipse.core.databinding) добавляет прослушиватель

target.addValueChangeListener(targetChangeListener);

, где целью является моя AbstractObservableValue реализация (DateChooserObserver), а прослушиватель по умолчанию

private IValueChangeListener targetChangeListener = new IValueChangeListener() {
    @Override
    public void handleValueChange(ValueChangeEvent event) {
        if (!updatingTarget
                && !Util.equals(event.diff.getOldValue(), event.diff
                        .getNewValue())) {
            doUpdate(target, model, targetToModel, false, false);
        }
    }
};

Это моя цельНаблюдатель:

public class DateChooserObserver extends AbstractObservableValue<Date> {

    private DateChooserCombo widget;

    public DateChooserObserver(DateChooserCombo widget) {
        super();
        this.widget = widget;
    }

    @Override
    public Object getValueType() {
        return Date.class;
    }

    @Override
    protected Date doGetValue() {
        return widget.getValue();
    }

    @Override
    protected void doSetValue(Date value) {
        widget.setValue(value);
    }

}

Единственное, о чем я могу думать, это то, что мне может понадобиться поместить наблюдателя изменения значения (каким-то образом) в поле фактической даты, а не в виджет, но я не уверен, как это сделать.

Понятия не имею, почему это не работает.Из двух преобразователей, которые у меня есть (преобразовать атрибут в виджет и виджет в атрибут), оба запускаются изначально, но, как я уже сказал, слушатель не обнаруживает изменения в поле java.util.date виджета (или самого виджета, яне знаю) и конвертировать виджет в атрибут не выполняется при выборе новой даты.

1 Ответ

0 голосов
/ 14 декабря 2018

Чтобы не быть DenverCoder9 , я отправлю свое решение на все это.

Первое: у меня не было полного доступа к используемому нами виджету, поэтому яНе удалось создать «правильную» реализацию, но я нашел обходной путь:

В классе AbstractObservableValue есть метод addValueChangeListener(ValueChangeListener listener), который можно переопределить.Это дает вам прямой доступ к слушателю, и вы можете принудительно активировать его метод handleEvent.

У меня сейчас нет актуального кода, надеюсь, я не забуду обновить этот ответв следующий понедельник, но решение было что-то вроде этого:

public class DateChooserObserver extends AbstractObservableValue<Date> {

    ...

    @Override
    public void setValueChangeListener(ValueChangeListener listener) {
        super.setValueChangeListener(listener);
        widget.getText().addModifyListener(e -> {
            listener.handleEvent(new ValueChangeEvent(this, getDummyDiff();
        });
    }

    // returns a diff with different dates to always evaluate true in doUpdate()
    public ValueDiff<Date> getDummyDiff() {
        return new ValueDiff() {

            @Override
            public Date getOldValue() {
                return new Date(1,1,1);
            }

            @Override
            public Date getNewValue() {
                return new Date(1,1,2);
            }
        }

    }

Обновление должно было бы дать фактические старые / новые даты в diff, так как он пытается не выполнять обновление, если даты не имеютизменился, но у меня не было возможности их получить, поэтому единственным верным решением было «всегда истинное» сравнение.

TL; DR, есть слушатель, слушатель делает что-то, но если у вас нет совместимоговиджет или доступ к внутренней работе виджета, вы должны принудительно вызвать событие дескриптора этого слушателя.

PS Я не уверен, если doUpdate() это имя метода в привязке данных, просто заполнитель, имеетмало релевантны в любом случае.

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