Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 在GWT中显示图像_Image_Gwt_Widget - Fatal编程技术网

Image 在GWT中显示图像

Image 在GWT中显示图像,image,gwt,widget,Image,Gwt,Widget,我已经创建了一个小部件来显示幻灯片。在firefox中,一切都很好,但在chrome中什么也没发生。在多次刷新后,将显示幻灯片。我不知道为什么。你能给我一些想法吗?Tks 这是我的GWT客户端: public SlideClient() { super(); setStyleName("flexslider"); setHeight("100%"); setWidth("100%"); } @Override public void updateFromUID

我已经创建了一个小部件来显示幻灯片。在firefox中,一切都很好,但在chrome中什么也没发生。在多次刷新后,将显示幻灯片。我不知道为什么。你能给我一些想法吗?Tks 这是我的GWT客户端:

public SlideClient() {
    super();
    setStyleName("flexslider");
    setHeight("100%");
    setWidth("100%");

}

@Override
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
    this.client = client;
    this.paintableId = uidl.getId();
    listImage = Arrays.asList(uidl.getStringArrayAttribute("listImage"));
    listUrl = Arrays.asList(uidl.getStringArrayAttribute("listUrl"));

    loadImage();
    checkImagesLoadedTimer.run();
}

public void display() {
    m.setStyleName("slides");
    m.setHeight("100%");
    m.setWidth("100%");
    add(m);
}

public native void slideshow() /*-{
$wnd.$('.flexslider').flexslider({slideshowSpeed: 2000});
}-*/;

public native String getURL(String url)/*-{
return $wnd.open(url,
'target=_blank')
}-*/;

private Timer checkImagesLoadedTimer = new Timer() {

    @Override
    public void run() {

        if (loadedImageElements.size() == toLoad) {
            display();
        } else {
            add(new Label("đang load "+loadedImageElements.size()));
            checkImagesLoadedTimer.schedule(2000);
        }
    }
};

private void loadImage() {
    for (String tmp : listImage) {
        AbsolutePanel panel = new AbsolutePanel();
        final Image ima = new Image(tmp);
        add(new Label("before put"));
        ima.addLoadHandler(new LoadHandler() {

            @Override
            public void onLoad(LoadEvent event) {
                loadedImageElements.put(toLoad+"", ima);
                slideshow();
                add(new Label("đang put "+loadedImageElements.size()));
            }
        });
        add(new Label("after put"));

        panel.add(ima);
        m.add(panel);

        if (toLoad != 0) {
            panel.setVisible(false);
        }
        toLoad++;

    }

}

}

您是否实施了图像加载器,以便在图像显示之前进行准备?一个干净的解决方案是将图像元素作为不可见的istance添加到页面根目录中,等待它们加载,然后在其他地方使用它们

您还应该查看有关ImageBundling的教程:

下面是根据您的要求从我的一个图像加载器类中提取的一点内容,尽管有不同的方法可以实现这一点:

private HashMap<String,ImageElement> loadedImageElements = new HashMap<String,ImageElement>();
private int toLoad = 0;

private void loadImage(final String name, String url){
    final Image tempImage = new Image(url);             
    RootPanel.get().add(tempImage);

    ++toLoad;

    tempImage.addLoadHandler(new LoadHandler(){
        public void onLoad(LoadEvent event) {               
            loadedImageElements.put(name,ImageElement.as(tempImage.getElement()));
            tempImage.setVisible(false);                
        }           
    });
}
准备好EverythSign后,将创建原始小部件/页面


但正如我所说,有很多方法可以实现图像加载器。尝试不同的实现,并选择最适合您需要的实现。

Tks。我会试试,但你能给我一些关于图像加载器的例子吗?我试过你的方法,但没有任何改变。我发布了我的widget客户端。你能给我一些理想吗?你有没有实施计时器?如果不等待图像加载,JS将抛出nullPointerException。此外,您没有将唯一名称与ImageElements关联,而是在加载程序中使用了“”,这将导致每次加载图像时覆盖关联。我修复了ImageElements的唯一名称。我试图实现计时器,但我不知道代码中的“buildWidget()”是什么……buildWidget()只是我使用的元素的初始化函数的一部分。基本上是这样的:onModuleLoad()=>调用计时器,当ready=>计时器执行网站的“构建”时。如果你没有大量的图像,也没有实现奇怪的东西,那么这个过程应该不会被用户注意到。
private Timer checkImagesLoadedTimer = new Timer(){
    public void run() {
        System.out.println("Loaded " + loadedImageElements.size() + "/" + toLoad + " Images.");
        if(loadedImageElements.size() == toLoad){
            buildWidget();
        }else{              
            checkImagesLoadedTimer.schedule(50);
        }
    }       
};