Eclipse RAP с OSGi Изображения на етикети няма да се показват

Имам RAP приложение, работещо в OSGI. И искам да покажа някои изображения.

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

Опитах няколко различни неща от дни, но мисля, че съм заседнал на този етап.

Опитах се да го направя така:

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

Дори го пробвах с MarkUps

но не мога да намеря това, което ми липсва.

изображенията са в приставката в папка, наречена icons и аз избрах папката icons във файла build.properties.

FYI: Видях RAP демонстрацията със синия хедър и имплементирах снимката си по този начин. Първоначално работеше, но веднага щом го стартирах като OSGI приложение, можех да видя границата само за командата SWT.BORDER


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


Отговори (1)


Предполагам, че stream в loadImage() е null. Което означава, че папката 'icons' не е част от пътя на класа. Добавянето на папка на Soley към файла build.properties не го прави част от пътя на класа.

Тук имате две възможности: Поставете изображенията във вашия клас-път или заредете изображението от приставката.

Поставете изображение на Class-path

Поставете изображението до (т.е. в същия пакет като) класа BasicEntryPoint. След това можете да отворите входния поток с

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

Обърнете внимание, че класът се използва тук за получаване на потока от ресурси вместо зареждането на класове. Второ, имайте предвид, че името на ресурса е само името на изображението (без пътя към неговия пакет).

Като алтернатива можете да използвате зареждащия клас и да посочите пълния път до изображението, за да получите входния поток

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

Препоръчвам решението class-path, защото работи по същия начин, независимо дали работите на OSGi или не.

Заредете изображение от Plug-in

Ако предпочитате да държите файла с изображение извън пътя на класа, трябва да посочите папката „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