изменение изображения разведчика затмения

Я пытаюсь изменить изображение в представлении изображения.

Я знаю, что getTestImageField().setImageId(Icons.Logo); не сработает, потому что не обновит рендерер.

Поскольку мне нужно использовать setImage(), мне нужен способ получить изображение из класса Icons.

Как предложил Патрик, я попробую

final IconProviderService provider = SERVICES.getService(IconProviderService.class);
final IconSpec ic = provider.getIconSpec(AbstractIcons.StatusError);
final byte[] content = ic.getContent(); 

но моя проблема в том, что ic всегда null.

Пока я отлаживаю это, я замечаю, что внутри IconProviderService.class в строке 57:

@Override
protected URL findResource(String fullPath) {
  URL[] entries = FileLocator.findEntries(m_hostBundle, new Path(fullPath));
  if (entries != null && entries.length > 0) {
    URL url = entries[entries.length - 1];
    if (LOG.isDebugEnabled()) {
      LOG.debug("find image " + fullPath + " in bundle " + m_hostBundle.getSymbolicName() + "->" + url);
    }
    return url;
  }
  return null;
}

URL[] записей всегда пусты, независимо от того, какую иконку ведьмы я пытаюсь представить.

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

Bundle[] fragments = activator.getFragments(b); 

но Bundle[] fragments всегда равно нулю.

Обычно мой пакет b равен (Bundle) EquinoxBundle : org.eclipse.scout.rt.ui.rap.mobile_4.0.100.20140829-1424.

Я хочу попробовать с другим пакетом, поэтому я делаю:

final BundleContext context = Activator.getDefault().getBundle().getBundleContext();

for (final Bundle b : context.getBundles()) {

    final IconProviderService provider = SERVICES.getService(IconProviderService.class);
    provider.setHostBundle(b);
    final IconSpec ic = provider.getIconSpec(AbstractIcons.StatusError);
    if (ic != null) {
        final byte[] content = ic.getContent();
        imageField().setImage(content);
    }
}

но fragments (из приведенного выше кода) всегда равно нулю.


person Marko Zadravec    schedule 18.08.2015    source источник
comment
Звучит как крепкий орешек. Не могли бы вы добавить следующую информацию: Иконки у вас вообще работают? (например, getConfiguredIconId в столбце таблицы) Где находится файл значка (png), который вы хотите отобразить? Где находится соответствующий класс Icons (файл java)? В каком комплекте вы получаете значок? Каково значение m_hostBundle в AbstractIconProviderService во время вызова для получения IconSpec?   -  person Patrick    schedule 21.08.2015
comment
Да, установка иконок работает. Если я установил getConfiguredIconId, он работает, и если в коде установить setIconId и страницу обновления, он тоже работает. Значки — это значки по умолчанию, которые входят в состав Scout, или значки, которые я добавляю (клиент/ресурсы/значки/...). Icons.class находится в общей папке (корень). Пакет, который я разместил, выглядит следующим образом: org.eclipse.scout.rt.ui.rap.mobile.   -  person Marko Zadravec    schedule 21.08.2015
comment
Я пытаюсь установить другой пакет provider.setHostBundle(Activator.getDefault().getBundle()); но это тоже не сработало.   -  person Marko Zadravec    schedule 21.08.2015
comment
Я забыл, я пытаюсь установить значок внутри формы и внутри клиентского пакета (другой класс)   -  person Marko Zadravec    schedule 21.08.2015
comment
Я добавляю вопрос редактирования (Редактировать 3)   -  person Marko Zadravec    schedule 21.08.2015
comment
За этим вопросом невозможно уследить... Так много EDIT...   -  person Jmini    schedule 25.08.2015
comment
Вы хотите изменить мой вопрос?   -  person Marko Zadravec    schedule 25.08.2015
comment
Я редактирую вопрос, чтобы он был более читабельным   -  person Marko Zadravec    schedule 25.08.2015


Ответы (1)


Вы можете получить содержимое изображения (byte[]), которое можно установить в поле изображения, следующим образом:

IconProviderService provider = SERVICES.getService(IconProviderService.class);
byte[] content = provider.getIconSpec(Icons.YourIconName).getContent();
getImageField().setImage(content);

Я быстро проверил это, и это работает для меня. Убедитесь, что значок доступен, и вы настроили службу поставщика значков, как описано в этой статье Wiki.

person Patrick    schedule 21.08.2015
comment
Спасибо за ваш ответ, но когда я пытаюсь это сделать, я получаю provider.getIconSpec(Icons.YourIconName) = null; окончательный код IconProviderService provider = SERVICES.getService(IconProviderService.class); конечный байт [] content = provider.getIconSpec(AbstractIcons.StatusError).getContent(); дал мне исключение nullPointer - person Marko Zadravec; 21.08.2015