1

I have a RAP Application running in OSGI. And I want to display some images.

Unfortunately my browser won´t show the image for the file I want. I tested it with an very small gif, which showed. But just one. When I exchanged it with an other it still won´t work. The exact problem is, that, if I place a border around the pictures, i can see the border. But there is nothing in the border.

I have tried a number of different things for days now but I think I´m stuck at this point.

I tried doing it like this:

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

and like this:

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

I even tried it with MarkUps

but i can´t find what i´m missing.

the images are in the plug-in in a folder called icons and i have selected the icons folder in the build.properties file.

FYI: I saw the RAP Demo with the Blue Header and Implemented my picture like this. At first it worked, but as soon as I started it as a OSGI App I could only see the border for the command SWT.BORDER

Rüdiger Herrmann
  • 20,512
  • 11
  • 62
  • 79
der_Chris
  • 45
  • 5

1 Answers1

0

My guess is that stream in loadImage() is null. Which means that the 'icons' folder is not part of the class-path. Soley adding a folder to the build.properties file does not make it part of the class-path.

You have two options here: Put the images on your class-path or load the image from the plug-in.

Put Image on Class-path

Place the image alongside (i.e. in the same package as) the BasicEntryPoint class. Then you can open the input stream with

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

Note that the class is used here to get the resource stream instead of the class-loader. Second, note that the resource name is just the name of the image (without the path to its package).

Alternatively you can use the class-loader and specify the full path to the image to obtain the input stream

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

I recommend the class-path solution because it works the same whether you run on OSGi or not.

Load Image from Plug-in

If you prefer to hold the image file outside the class-path, you have to specify the 'icons' folder in the build.properties as you already did:

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

The bundle entry can then be access like this:

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

See also this article for a detailed comparison of both approaches and possible pitfalls.

Rüdiger Herrmann
  • 20,512
  • 11
  • 62
  • 79
  • Thanks for your reply. I tried that yesterday to and I managed to get it work. But the problem was something different. Stupid me... At start I was getting the "rwt-resources path already used" error. So my guess was the Image could not be written properly. After removing all the Eclipse.UI Packages the Image could be uploaded and therefore was visible in the browser. – der_Chris Dec 04 '14 at 08:24