在 wicket 中加载图像时显示加载屏幕
Show loading Screen while Image is loading in wicket
我正在用图像填充 ListView
。
在伪代码中:
populateItem(model){
load base64 from database
image.setDefaultModel(base64)
图像只是 webcomponent
而在 html 中它只是 <img src="">
如何在加载图像时显示指示器?
我首先想到添加 IAjaxIndicatorAware
但这会在图像执行 AjaxRequest
.
时触发指示器
由于您似乎将图像加载并显示为 Base64 src,它将直接在 html 响应中发送并且稍后不会加载(与具有链接到另一个 URI 的 src 的图像相反)。
您可以将图像包裹在 AjaxLazyLoadPanel 中。
这将在生成内容时首先显示 AjaxIndicator,然后在完成后由实际加载的内容替换 loading/generating:
编辑
I got an Exception : Component must be applied to a tag of type [img].
我没有考虑过这个问题。 AjaxLazyLoadPanel 始终使用 <div>
作为 html 标记来显示它加载的组件。要显示 base 64 图像,您需要将其包装在另一个面板中:
public class Base64ImagePanel extends Panel {
public Base64ImagePanel(String wicketId, String base64Data, String contentType) {
super(wicketId);
WebMarkupContainer image = new WebMarkupContainer("image") {
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
checkComponentTag(tag, "img");
tag.put("src", "data:" + contentType + ";base64," + base64Data);
}
}
add(image);
}
}
Base64ImagePanel.html:
<wicket:panel>
<img wicket:id="image"></img>
</wicket:panel>
然后在 AjaxLazyLoadPanel 中使用该包装面板:
add(new AjaxLazyLoadPanel("imageLazyLoad") {
@Override
public Component getLazyLoadComponent(String id) {
//load your actual base64 from database, i use some example Strings for demonstration in the following line
Base64ImagePanel imagePanel = new Base64ImagePanel(id, "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", "image/png");
return imagePanel;
}
});
我正在用图像填充 ListView
。
在伪代码中:
populateItem(model){
load base64 from database
image.setDefaultModel(base64)
图像只是 webcomponent
而在 html 中它只是 <img src="">
如何在加载图像时显示指示器?
我首先想到添加 IAjaxIndicatorAware
但这会在图像执行 AjaxRequest
.
由于您似乎将图像加载并显示为 Base64 src,它将直接在 html 响应中发送并且稍后不会加载(与具有链接到另一个 URI 的 src 的图像相反)。
您可以将图像包裹在 AjaxLazyLoadPanel 中。 这将在生成内容时首先显示 AjaxIndicator,然后在完成后由实际加载的内容替换 loading/generating:
编辑
I got an Exception : Component must be applied to a tag of type [img].
我没有考虑过这个问题。 AjaxLazyLoadPanel 始终使用 <div>
作为 html 标记来显示它加载的组件。要显示 base 64 图像,您需要将其包装在另一个面板中:
public class Base64ImagePanel extends Panel {
public Base64ImagePanel(String wicketId, String base64Data, String contentType) {
super(wicketId);
WebMarkupContainer image = new WebMarkupContainer("image") {
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
checkComponentTag(tag, "img");
tag.put("src", "data:" + contentType + ";base64," + base64Data);
}
}
add(image);
}
}
Base64ImagePanel.html:
<wicket:panel>
<img wicket:id="image"></img>
</wicket:panel>
然后在 AjaxLazyLoadPanel 中使用该包装面板:
add(new AjaxLazyLoadPanel("imageLazyLoad") {
@Override
public Component getLazyLoadComponent(String id) {
//load your actual base64 from database, i use some example Strings for demonstration in the following line
Base64ImagePanel imagePanel = new Base64ImagePanel(id, "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", "image/png");
return imagePanel;
}
});