1

我有一个在 OSGI 中运行的 RAP 应用程序。我想显示一些图像。

不幸的是,我的浏览器不会显示我想要的文件的图像。我用一个非常小的 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文件夹。

仅供参考:我看到了带有蓝色标题的 RAP 演示并像这样实现了我的图片。起初它有效,但是当我将它作为 OSGI 应用程序启动时,我只能看到命令 SWT.BORDER 的边框

4

1 回答 1

0

我的猜测是streamin loadImage()is null。这意味着“图标”文件夹不是类路径的一部分。Soley 将文件夹添加到build.properties文件不会使其成为类路径的一部分。

您有两个选择:将图像放在类路径中或从插件加载图像。

将图像放在类路径上

将图像放在BasicEntryPoint类旁边(即在同一个包中)。然后你可以打开输入流

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

请注意,这里使用类来获取资源流,而不是类加载器。其次,请注意资源名称只是图像的名称(不包括其包的路径)。

或者,您可以使用类加载器并指定图像的完整路径来获取输入流

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

我推荐类路径解决方案,因为无论您是否在 OSGi 上运行,它的工作原理都是一样的。

从插件加载图像

如果您希望将图像文件保存在类路径之外,则必须像以前一样在 'icons' 文件夹中指定build.properties

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

然后可以像这样访问捆绑条目:

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

另请参阅这篇文章,详细比较这两种方法和可能的陷阱。

于 2014-12-04T07:47:16.353 回答