GWT:如何动态加载新图像?

时间:2013-05-01 04:27:27

标签: gwt

我想从远程服务器(不是我的应用程序的服务器,但我认为不重要)获取图像,并将其显示在现有的Image小部件中。现有小部件显示其原始内容,来自ClientBundle ImageResource,OK。

在UiBinder模板中:

<g:Image ui:field='myImage' resource='{res.anImage}'/>

在代码中:

@UiField Image      myImage;
...
int width = Window.getClientWidth();
int height = Window.getClientHeight();
String url = ...;

myImage.addErrorHandler(new ErrorHandler() {
    public void onError(ErrorEvent event) {
        Window.alert("Error getting image data: " + event);
    }
  });
myImage.addLoadHandler(new LoadHandler() {
    public void onLoad(LoadEvent event) {
        Window.alert("LoadEvent: " + event);
    }
  });
myImage.setUrlAndVisibleRect(url, 0, 0, width, height);

据我所知,setUrlAndVisibleRect是一个无操作。 FireBug不报告网络活动 - 没有向URL指定的服务器发出请求。我在俯瞰什么?在我试图让这个工作得到延伸的时候,我推断它可能与myImage有关,而不是“逻辑依恋”,但我不完全确定这意味着什么,我已经如果这是问题,不知道如何纠正它。

使用解决方案摘要进行编辑: 我最初的预感是正确的。因为我选择在第二个伪小部件(...extends Composite)中实现图像代码,该小部件与实现我应用程序大部分UI的主伪小部件共享我的UiBinder模板,我遇到了麻烦。我忽略了将第二个伪小部件添加到RootPanel,这通常在实现EntryPoint的类中完成。这使得我的Image小部件未附加到小部件链,因为它的父级,第二个伪小部件是未附加的。并且必须附加图像小部件才能工作。我最终做的是将Image代码移回我的主app / GUI类,即,转移到第一个也是现在唯一的伪小部件,并放弃Image代码的特殊类。我这样做是因为它更简单,而且图像代码不像我原先想的那么长。

2 个答案:

答案 0 :(得分:1)

向DOM添加图片有点棘手,下面的代码支持所有浏览器(setVisibility技巧也支持IE,因为它有不同的图像渲染方式)。

我之前没有使用setUrlAndVisibleRect和AFAIK,Image必须渲染到DOM才能调整它的大小。只需尝试以下代码。

 image.addLoadHandler(new LoadHandler() {
                @Override
                public void onLoad(LoadEvent event) {
              //Do your operations on image .//resize ..etc
             image.getElement().getStyle().setVisibility
                                          (Style.Visibility.Visible); 
                      }
                 });

    image.getElement().getStyle().setVisibility(Style.Visibility.HIDDEN); 
    RootPanel.get().add(image);
    image.setUrl(url);

答案 1 :(得分:0)

您使用的是{{1>} 编译时 。您无法更改它,除非您在prev照片的确切位置替换新图像。可能的hack之一是,将图像放置在ID设置为{ClientBundle ImageResource)的div中。一旦您获得新图片,就可以使用RootPanel.get("Your Id")来完成工作。