Java setUrl不';不要在GWT中更改任何内容

Java setUrl不';不要在GWT中更改任何内容,java,image,gwt,Java,Image,Gwt,My ui.xml包含以下代码段: <g:VerticalPanel ui:field="fooPanel"> <g:Image ui:field="fooImage" /> </g:VerticalPanel> 其他地方也有一个按钮。在这个按钮的onClick事件中,我进行了一个RPC服务调用,在该调用中,我得到一个base64编码的字符串,并将其设置为映像: @UiHandler("fooButton") public void onSubm

My ui.xml包含以下代码段:

<g:VerticalPanel ui:field="fooPanel">
    <g:Image ui:field="fooImage" />
</g:VerticalPanel>

其他地方也有一个按钮。在这个按钮的onClick事件中,我进行了一个RPC服务调用,在该调用中,我得到一个base64编码的字符串,并将其设置为映像:

@UiHandler("fooButton")
public void onSubmit(ClickEvent clickEvent) {
    ...
    AsyncCallback<String> callback = new AsyncCallback<String> {

        @Override
        public void onSuccess(String foo) {
            fooImage.setUrl("data:image/png;base64," + foo);
            fooImage.setPixelSize(304, fooImage.getHeight() * 304 / fooImage.getWidth());
        }

        @Override
        public void onFailure(Throwable caught) {
            Window.alert(caught.getMessage());
        }
    };
    fooServiceAsync.getFoo(bar, callback);
}
@UiHandler(“fooButton”)
提交时公共作废(点击事件点击事件){
...
AsyncCallback callback=新的AsyncCallback{
@凌驾
成功时的公共void(字符串foo){
setUrl(“数据:image/png;base64,”+foo);
setPixelSize(304,fooImage.getHeight()*304/fooImage.getWidth());
}
@凌驾
失败时的公共无效(可丢弃){
Window.alert(catch.getMessage());
}
};
getFoo(bar,回调);
}

服务很好。但是为什么不显示图像呢?

我对您的代码做了最小的更改,就得到了图像

Example.ui.xml

<g:HTMLPanel>
        <g:Button ui:field="fooButton"></g:Button>
        <g:VerticalPanel ui:field="fooPanel">
            <g:Image ui:field="fooImage" />
        </g:VerticalPanel>
</g:HTMLPanel>

另外,我删除了变量
bar
,因为我不知道如何使用它。也许您将从
YourServiceImpl.java
类提供
getFoo()
方法的实现。

好的,问题是这一行:

fooImage.setPixelSize(304, fooImage.getHeight() * 304 / fooImage.getWidth());
fooImage.getHeight()正在返回0。但是当我在Window.alert(“random”)中放置一个
窗口时
setUrl
setPixelSize
命令之间,图像以我指定的尺寸显示

因此,为了解决这个问题,我在
setUrl
setPixelSize
命令之间插入了以下代码

Timer timer = new Timer() {

    @Override
    public void run() {
    }
};
timer.schedule(500);
也许,通过给予500毫秒的延迟,它允许图像初始化其尺寸

更新:原来是浏览器问题。我在RHEL5(我们使用的开发机器)上使用Firefox。当我使用另一台具有更新操作系统的机器连接到GWT应用程序时,一切都按预期进行。对不起,误报了


更新2:即使在最近的操作系统(Windows7BTW)上,Firefox也存在这个问题。使用
olgacosta
的解决方案证明是完美的

bar
是服务的输入!哦。我做了一个检查元素,宽度是304,高度是0!为什么?你是说你检查了你的图像?你能提供你的fooImage url吗?上面写着
“style=“width:304px;高度:0px;“>
@pratnala,我不认为
定时器
是最好的解决方案。试着使用
LoadEvent
并检查我编辑的答案我很高兴你已经解决了所有问题!)。但是我在标准PC上(Windows 7和
Firefox
)调整图像大小也有问题。因此我建议您将
LoadEvent
添加到
fooImage
@olgacosta,您是对的。Firefox无法处理它。使用了您的
LoadEvent
解决方案。现在一切都好了!:@olgacosta您的解决方案适用于Firefox,但不适用于Chrome。我的解决方案适用于Chrome,而不适用于Firefox。奇怪的浏览器。我现在硬编码了高度和宽度。同样,图片没有足够的时间启动。如果您在
setPixelSize()之前放置
窗口。警报(“”
,图像将出现。真的weirdI发现了一些东西,但它非常旧:
图像加载事件
当图像不立即可见时不会触发。尝试删除
setVisible()
,示例将正常工作
fooImage.setPixelSize(304, fooImage.getHeight() * 304 / fooImage.getWidth());
Timer timer = new Timer() {

    @Override
    public void run() {
    }
};
timer.schedule(500);