Платформа NetBeans — как обновить представление листа свойств узла?

Я использую компонент PropertySheetView для визуализации и редактирования свойств узла. Это представление всегда должно отражать самые последние свойства объекта; если есть изменение объекта в другом процессе, я хочу как-то обновить представление и увидеть обновленные свойства.

Лучший способ, которым я смог это сделать, примерно следующий (используя библиотеку EventBus для публиковать и подписываться на изменения в объектах):

public DomainObjectWrapperNode(DomainObject obj) {
    super (Children.LEAF, Lookups.singleton(obj));
    EventBus.subscribe(DomainObject.class, this);
}

public void onEvent(DomainObject event) {
    // Do a check to determine if the updated object is the one wrapped by this node;
    // if so fire a property sets change

    firePropertySetsChange(null, this.getPropertySets());
}

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

Итак, мой вопрос: есть ли лучший способ обновить представление листа свойств узла, в частности, чтобы мое место в списке свойств не терялось при обновлении?

Решение firePropertySetsChange взято из этой темы.


person I82Much    schedule 11.04.2010    source источник


Ответы (3)


Просто чтобы уточнить мой старый ответ как незарегистрированного пользователя: вызов createSheet(null) вызовет NullPointerException. Вместо этого используйте setSheet(createSheet()).

person Charles Bedon    schedule 15.11.2016

Решение состоит в том, чтобы активировать изменение свойства для каждого измененного свойства обновленного объекта. Итак, в контексте фрагмента вопроса это может быть что-то вроде:

public void onEvent(DomainObject event) {
    // Do a check to determine if the updated object is the one wrapped by this node;
    // if so fire a property sets change

    Set<Property> changes = new HashSet<Property>();
    // Populate the set from property set of the node using the event 
    // (or add all properties to force updating all properties)

    for (Property change : changes) {
        firePropertyChange(change.getName(), null, change.getValue());
    }
}

Обратите внимание, что набор свойств не следует изменять, так как это приведет к путанице в редакторах свойств. Следовательно, фактические объекты свойств должны поддерживать изменение объекта домена, стоящего за свойством.

person tPeltola    schedule 26.07.2010

Вы также можете установить лист свойств узла на null, чтобы метод createSheet вызывался снова.

person Charles Bedon    schedule 22.08.2012