Платформа NetBeans - как обновить представление листа свойств узла? - PullRequest
1 голос
/ 12 апреля 2010

Я использую компонент 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 исходит из этой темы .

Ответы [ 3 ]

3 голосов
/ 15 ноября 2016

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

1 голос
/ 22 августа 2012

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

1 голос
/ 26 июля 2010

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

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

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

...