使用ClientBundle图像作为背景图像

Geo*_*old 9 gwt uibinder

我正在尝试使用来自ClientBundleUIBInder模板中的背景图像的图像.我以此讨论为指导,但无法使其发挥作用.

在我的Java类中,我有:

public static interface PriceButtonStyles extends ClientBundle
{
    String paidIcon();

    @ClientBundle.Source("paid_button_53x31.png")
    DataResource paid_buttonAsDataResource();
}

@UiField
PriceButtonStyles priceButtonStyle;
Run Code Online (Sandbox Code Playgroud)

然后在相应的模板文件中我引用它:

<ui:style field="priceButtonStyle" type="com.example.client.PriceButton.PriceButtonStyles">

    @url paidIconUrl paid_buttonAsDataResource;

    .paidIcon {
        background: paidIconUrl 0 0 no-repeat;

    }
</ui:style>
Run Code Online (Sandbox Code Playgroud)

在这一点上,我的IDE正在以红色显示"paidIconUrl"字符串,表明某些内容不太正确:

ide显示红色

事实上,当我尝试运行它时,我得到:

    ERROR: Type com.ecample.client.PriceButton.PriceButtonStyles does not extend com.google.gwt.resources.client.CssResource Element <ui:style field='priceButtonStyle' type='com.example.client.PriceButton.PriceButtonStyles'> (:7). 
ERROR: Uncaught exception escaped. com.google.gwt.event.shared.UmbrellaException: One or more exceptions caught, see full set in UmbrellaException#getCauses
Run Code Online (Sandbox Code Playgroud)

谷歌小组的讨论中,有人建议这可能与之相关,<ui:data>而不是<ui:style>,所以我试图让它发挥作用.但似乎你不能paidIcon()<ui:data>资源中同时包含CSS样式(例如我的方法)和DataResources .我无法找到很多文档<ui:data>,所以我真的只是抓住稻草.

Ste*_*fan 7

除了要设置src属性的Images之外,还必须进行设置

<g:Image url="{res.minimize.getSafeUri.asString}" ....>
Run Code Online (Sandbox Code Playgroud)

res实例化如下:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui">

    <ui:with field="res"
        type="xxx.myRes"></ui:with>
....
Run Code Online (Sandbox Code Playgroud)

并且客户端包看起来像这样:

package xxx;

import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;

public interface myRes extends ClientBundle {

    @Source("minimize.png")
    ImageResource minimize();

}
Run Code Online (Sandbox Code Playgroud)

GWT.<TitleBarBundle>create(myRes.class);在我的情况下,不需要创建ClientBundle(例如).

谢谢你的回答Chris Boesing,但我觉得我也必须与你分享我的经历.

此致,斯特凡


Chr*_*ing 4

我是这样做的。这与您的方法略有不同,但在这种情况下对我来说非常有效。您的 ClientBundle 看起来像这样:

public static interface PriceButtonStyles extends ClientBundle
{
     @Source("PriceButtonStyles.css")
     Styles priceButtonStyles();

     @Source("paid_button_53x31.png")
     ImageResource paidButtonPNG();

     interface Styles extends CssResource {
         String buttonBackground();
     }
}
Run Code Online (Sandbox Code Playgroud)

然后你需要从第一个开始的 PriceButtonStyles.css @Source

.buttonBackground {
    gwt-image:'paidButtonPNG';
    background-repeat:no-repeat;
}
Run Code Online (Sandbox Code Playgroud)

你的 *.ui.xml 看起来像这样:

<ui:with field="res" type="com.ecample.client.PriceButton.PriceButtonStyles"></ui:with>
<g:Label styleName="{res.priceButtonStyles.buttonBackground}"><g:Label>
Run Code Online (Sandbox Code Playgroud)

即使您的样式位于 css 文件中,它仍然会被编译器最小化和混淆。
编辑:不要忘记调用
GWT.<PriceButtonStyles> create(PriceButtonStyles.class).priceButtonStyles().ensureInjected(); 最好的地方,因为这是您的 EntryPoint 方法