Прослушивание изменений в WritableList

Класс модели данных

Создание списка IObservableList

  1. IObservableList observableList = новый WritableList();
  2. Добавить метод для добавления данных в observableList
  3. Метод возврата observableList

Класс просмотра таблиц

  1. Установите поставщика контента в ObservableListContentProvider

Класс графического интерфейса

  1. Средство просмотра setInput для получения ObservableList из класса модели данных

Кажется, все работает как надо, средство просмотра таблиц обновляется с изменениями в ObservableList.

Но проблема, с которой я сталкиваюсь, заключается в том, как обновить мои кнопки в графическом интерфейсе. У меня есть несколько кнопок, которые включают и отключают в зависимости от количества объектов в ObservableList в модели данных. Чтобы запустить эту логику, я должен знать, когда в списке есть изменения.

Я попытался реализовать IListChangeListener в классе GUI. Затем добавьте метод

public void handleListChange(ListChangeEvent arg0) {
  updateButtons();  <-- My method to run the logic

}

Это не работает, я должен реализовать что-то другое вместо IListChangeListener?

Я не уверен, что мне следует реализовать в классе GUI, чтобы отслеживать изменения?

ИЗМЕНИТЬ

Нужно ли добавлять слушателя в средство просмотра?

viewer = new AplotDataTableViewer(parent, SWT.BORDER|SWT.V_SCROLL|SWT.FULL_SELECTION);
viewer.setInput(AplotDataModel.getInstance().getObservableList());
viewer.addListener(etc... )

Это единственный вариант, который у меня есть

 addSelectionChangedListener(ISelectionChangeListener listener)

Меня не волнует изменение выбора - только если список изменился.


person jkteater    schedule 12.12.2012    source источник
comment
Да, реализация IListChangeListener — правильный путь. Что делает updateButtons()?   -  person Behnil    schedule 13.12.2012
comment
@Behnil Проверка списка, чтобы убедиться, что в списке есть хотя бы 1 объект. Если нет, я отключаю все кнопки, если есть, я включаю кнопки. Также, пожалуйста, смотрите редактирование выше   -  person jkteater    schedule 13.12.2012
comment
В чем проблема с ISelectionChangeListener? Разместите здесь содержимое updateButtons().   -  person Behnil    schedule 13.12.2012
comment
@Behnil Я вижу проблему, позвольте мне проверить   -  person jkteater    schedule 13.12.2012
comment
@Behnil Метод handleListChange (ListChangeEvent arg0) никогда не вызывается. Это потому, что я не добавил слушателя в Table Viewer?   -  person jkteater    schedule 14.12.2012
comment
@jkteater Не могли бы вы помочь мне, уточнив пункты 2 и 3 в вашем вопросе?   -  person Campa    schedule 19.02.2015


Ответы (1)


Я пробовал этот пример, и это работает для меня:

IObservableList observableList = new WritableList();
observableList.addListChangeListener(new IListChangeListener() {

    @Override
    public void handleListChange(ListChangeEvent event) {
        System.out.println(event.diff);
    }
});
observableList.add("element");
observableList.add("element");
observableList.add("element");

TableViewer viewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
viewer.getTable().setHeaderVisible(true);
viewer.getTable().setHeaderVisible(true);
viewer.setContentProvider(new ObservableListContentProvider());

TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
column.getColumn().setText("Column");
column.getColumn().setWidth(200);

column.setLabelProvider(new ColumnLabelProvider());

// Provide the input to the ContentProvider
viewer.setInput(observableList);

Теперь IListChangeListener вызывается три раза при запуске приложения, а затем каждый раз, когда я добавляю элемент в observableList.

person Behnil    schedule 13.12.2012