Eclipse RAP с OSGi Изображения этикеток не будут отображаться

У меня есть приложение RAP, работающее в OSGI. И я хочу отобразить некоторые изображения.

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

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

Я пытался сделать это так:

Image image3 = loadImage( parent.getDisplay(), "icons/test-100x50.png" );
Label l3 = new Label( parent, SWT.BORDER ); 
l3.setImage( image3 );

а вот так:

public static Image loadImage( Display display, String name ) {
    Image result = null;
    InputStream stream = BasicEntryPoint.class.getClassLoader().getResourceAsStream( name );
    if( stream != null ) {
        try {
            result = new Image( display, stream );
        } finally {
            try {
                stream.close();
            } catch( IOException unexpected ) {
                throw new RuntimeException( "Failed to close image input stream", unexpected );
            }
        }
    }
    return result;
}

Я даже пробовал это с разметкой

но я не могу найти то, что мне не хватает.

изображения находятся в плагине в папке с именем icons, и я выбрал папку icons в файле build.properties.

К вашему сведению: я видел демо-версию RAP с синим заголовком и реализовал свою картинку вот так. Сначала это работало, но как только я запустил его как приложение OSGI, я мог видеть только границу для команды SWT.BORDER.


person der_Chris    schedule 03.12.2014    source источник


Ответы (1)


Я предполагаю, что stream в loadImage() равно null. Это означает, что папка «иконки» не является частью пути к классам. Soley добавление папки в файл build.properties не делает его частью пути к классам.

Здесь у вас есть два варианта: поместить изображения в путь к классам или загрузить изображение из плагина.

Поместите изображение в путь к классам

Поместите изображение рядом с классом BasicEntryPoint (то есть в том же пакете). Затем вы можете открыть входной поток с помощью

BasicEntryPoint.class.getResourceAsStream( "test-100x50.png" );

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

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

BasicEntryPoint.class.getClassLoader().getResourceAsStream( "com/example/myapp/test-100x50.png" );

Я рекомендую решение class-path, потому что оно работает одинаково независимо от того, работаете вы на OSGi или нет.

Загрузить изображение из плагина

Если вы предпочитаете хранить файл изображения вне пути к классу, вам нужно указать папку «icons» в build.properties, как вы уже делали:

bin.includes = META-INF/,icons/,...

Доступ к записи пакета можно получить следующим образом:

Bundle bundle = FrameworkUtil.getBundle( BasicEntryPoint.class );
bundle.getEntry( "icons/test-100x50.png" ).openStream();

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

person Rüdiger Herrmann    schedule 04.12.2014
comment
Спасибо за ответ. Я попробовал это вчера, и мне удалось заставить его работать. Но проблема была в другом. Глупый я... В начале я получаю уже использованный путь rwt-resources. Итак, я предполагаю, что изображение не может быть написано правильно. После удаления всех пакетов Eclipse.UI изображение можно было загрузить, и поэтому оно было видно в браузере. - person der_Chris; 04.12.2014