3.5.2.1.14. 嵌入式组件(废弃)

从 CUBA Platform 6.8 开始这个 Embedded 组件就不推荐使用了。替换方案是使用 Image 组件来显示图片,用 BrowserFrame 组件来嵌入网页。

Embedded 组件是用来显示图片和在应用程序界面中嵌入任何形式的网页。

该组件对应的 XML 名称: embedded

下面这个例子演示了怎样用这个组件显示一个从 FileStorage 读取的图片:

  • 在 XML 描述中定义该组件:

    <groupBox caption="Embedded" spacing="true"
              height="250px" width="250px" expand="embedded">
        <embedded id="embedded" width="100%"
                  align="MIDDLE_CENTER"/>
    </groupBox>
  • 在界面控制器中,注入该组件和 FileStorageService 接口。在 init() 方法中,从调用方获取 FileDescriptor,然后加载对应的文件到字节数组中,并通过字节数组创建 ByteArrayInputStream 然后传给组件的 setSource() 方法:

    @Inject
    private Embedded embedded;
    @Inject
    private FileStorageService fileStorageService;
    
    @Override
    public void init(Map<String, Object> params) {
        FileDescriptor imageFile = (FileDescriptor) params.get("imageFile");
        byte[] bytes = null;
        if (imageFile != null) {
            try {
                bytes = fileStorageService.loadFile(imageFile);
            } catch (FileStorageException e) {
                showNotification("Unable to load image file", NotificationType.HUMANIZED);
            }
        }
        if (bytes != null) {
            embedded.setSource(imageFile.getName(), new ByteArrayInputStream(bytes));
            embedded.setType(Embedded.Type.IMAGE);
        } else {
            embedded.setVisible(false);
        }
    }

Embedded 组件支持几种不同类型的内容,在 HTML 里以不同方式渲染。可以用 setType() 来设置内容类型。支持的类型如下:

  • OBJECT - 允许在 HTML 的 <object> 和 <embed> 标签里嵌入特定的文件类型。

  • IMAGE - 在 HTML 的 <img> 标签嵌入图片。

  • BROWSER - 在 HTML 的 <iframe> 中嵌入一个网页。

在 Web Client 里面,这个组件支持显示存储在 VAADIN 文件夹的文件。可以采用相对路径来访问这个文件夹的资源,比如:

<embedded id="embedded"
          relativeSrc="VAADIN/themes/halo/my-logo.png"/>

或者:

embedded.setRelativeSource("VAADIN/themes/halo/my-logo.png")

也可以通过应用程序属性 cuba.web.resourcesRoot 来定义源文件目录。然后采用 file://url://,或者 theme:// 这些前缀引用这个目录下的文件:

<embedded id="embedded"
          src="file://my-logo.png"/>

或者

embedded.setSource("theme://branding/app-icon-menu.png");

如果要显示外部网页,把外部网页的 URL 传给这个组件就行了:

try {
    embedded.setSource(new URL("http://www.cuba-platform.com"));
} catch (MalformedURLException e) {
    throw new RuntimeException(e);
}