1

我想从远程服务器(不是我的应用程序的服务器,但我认为这不重要)获取图像并将其显示在现有的图像小部件中。现有小部件显示其原始内容,来自 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) 将我的 UiBinder 模板与实现我的应用程序的大部分 UI 的主要伪小部件共享,我遇到了麻烦。我忽略了将第二个伪小部件添加到 RootPanel,就像在实现 EntryPoint 的类中通常所做的那样。这使我的 Image 小部件未附加到小部件链,因为它的父级,第二个伪小部件未附加。并且必须附加一个 Image 小部件才能工作。我最终做的是将 Image 代码移回我的主应用程序/GUI 类,即移入第一个现在只有伪小部件,并放弃 Image 代码的特殊类。我这样做是因为它更简单,而且图像代码没有我最初想象的那么长。

4

2 回答 2

1

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

我以前没用过setUrlAndVisibleRect,AFAIK,图像必须渲染到 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);
于 2013-05-01T04:56:23.643 回答
0

您正在使用ClientBundle ImageResourcewhich 是compile time。除非您在上一张的确切位置用确切的名称替换新图像,否则您无法更改它一种可能的破解方法是,将图像放在一个 div 中,并设置其 ID ( getElement().setId("your ID"))。获得新图像后,您将使用RootPanel.get("Your Id")并完成您的工作。

于 2013-05-01T08:47:58.423 回答