Как получить TreeViewer в SWT для правильного обновления? - PullRequest
3 голосов
/ 05 октября 2011

У меня есть приложение, которое использует JFace TreeViewer.Я подключил его к ContentProvider.В основном, это прекрасно работает.Однако для некоторых действий, таких как добавление узла в середине списка узлов или изменение значения, которое должно изменить метку для узла, вызов refresh() не работает.Я попытался включить родительский узел, скажем "true" для обновления метки.Ничто не работает все время.

Я видел, что если я оставлю разборный узел закрытым, добавлю, а затем развернусь, будет показан добавленный узел.Но если он уже развернут, никаких изменений не отображается.Если я сохраню информацию о своем дереве на диск и посмотрю, изменения будут сделаны.Это просто TreeViewer обновление, которое не работает.

Я посмотрел на inputChanged метод в моем ContentProvider, но он вызывается только в начале и в конце выполнения моего приложения.

Кто-нибудь может помочь?Я прочитал все веб-страницы, которые даже намекают на ответ, и ничего не помогло.

Ответы [ 5 ]

2 голосов
/ 05 октября 2011

inputChanged (), если contentprovider не должен вызываться во время refresh () - он вызывается только при вызове setInput () для средства просмотра дерева.

В худшем случае вы можете вызвать setInput() с исходным вводом для обновления ваших элементов, но он может быть слишком медленным для вашего приложения.

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

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

1 голос
/ 27 октября 2011

Может быть, это очевидно для вас, но вы вызываете обновление из потока пользовательского интерфейса?В частности попробуйте следующее:

Display.getCurrent().asyncExec(new Runnable() {
    @Override
    public void run() {
      // TODO Call refresh() here
    }
});

Существует также метод syncExec ().

Надеюсь, это поможет!

0 голосов
/ 28 июня 2019

Для меня функции add (), update () или remove () работали довольно прилично, конечно, это раздражает, если делать это вручную ... но если вы вызываете их из вашей модели при изменении, это должно просто работать нормально .

0 голосов
/ 15 февраля 2012

К сожалению, ничего, что я не смог найти, решило это. Я закончил тем, что закрыл файл и открыл его снова, чтобы вызвать «обновление / обновление». Спасибо всем за совет.

0 голосов
/ 12 декабря 2011

Вы применили декоратор меток к своему TreeViewer?

Я только что отредактировал запись в своем TreeViewer без LabelDecorator, который я применял ранее, и update (selectedItem, null) фактически применил обновление (раньше оно ничего не делало).

Возможно, это ошибка jface?

[править] кажется, что вы должны использовать updateLabel () из вашего объекта DecoratingLabelProvider.

...