IndicatingAjaxButtonで表示される画像を変更する場合

wicket-extentionsのバージョンは1.3.5

 IndicatingAjaxButtonにおいて画像の表示を行うビヘイビアはWicketAjaxIndicatorAppenderですがIndicatingAjaxButtonクラス内では下記のように使用されています。

  1. public abstract class IndicatingAjaxButton extends AjaxButton implements IAjaxIndicatorAware{
  2. private static final long serialVersionUID = 1L;
  3. //直接Newされている。
  4. private final WicketAjaxIndicatorAppender indicatorAppender =
  5. new WicketAjaxIndicatorAppender();
  6. public IndicatingAjaxButton(String id, Form form){
  7. super(id, form);
  8. add(indicatorAppender);
  9. }
  10. protected abstract void onSubmit(AjaxRequestTarget target, Form form);
  11. public String getAjaxIndicatorMarkupId(){
  12. return indicatorAppender.getMarkupId();
  13. }
  14. }
ですのでIndicatingAjaxButtonをサブクラス化して独自の画像を表示させるクラスを作成したり、コンストラクタに何か渡すことで変更可能というわけではありません。

ですので、この場合はorg.apache.wicket.ajax.markup.html.form.AjaxButtonとorg.apache.wicket.ajax.!IAjaxIndicatorAwareを実装した独自のIndicatingAjaxButtonクラスを作成しなければいけません。また、実際に画像のURLが生成される箇所はWicketAjaxIndicatorAppender#getIndicatorUrlであるためこのメソッドをオーバーライドしたサブクラスも必要となります。

  1. public final class LazyLoadingPage extends WebPage {
  2. public LazyLoadingPage() {
  3. Form form = new Form("form");
  4. AjaxButton indicating = new MyIndicatingAjaxButton("submit", form) {
  5. @Override
  6. protected void onSubmit(AjaxRequestTarget target, Form form) {
  7. try {
  8. //画像がちゃんと表示されるかどうか確認のため2秒間スリープする。
  9. Thread.sleep(2000);
  10. } catch (InterruptedException e) {
  11. throw new RuntimeException(e);
  12. }
  13. }
  14. };
  15. add(form.add(indicating));
  16. }
  17. /**
  18. * 独自のIndicatingAjaxButton
  19. */
  20. private abstract class MyIndicatingAjaxButton extends
  21. AjaxButton implements IAjaxIndicatorAware{
  22. private WicketAjaxIndicatorAppender appender;
  23. public MyIndicatingAjaxButton(String id, Form form) {
  24. super(id, form);
  25. add(appender = getWicketAjaxIndicatorAppender());
  26. }
  27. public WicketAjaxIndicatorAppender getWicketAjaxIndicatorAppender(){
  28. return new MyAjaxIndicatorAppender();
  29. }
  30. @Override
  31. public String getAjaxIndicatorMarkupId() {
  32. return appender.getMarkupId();
  33. }
  34. }
  35. /**
  36. * 画像のパスを決定するビヘイビア
  37. */
  38. private class MyAjaxIndicatorAppender extends WicketAjaxIndicatorAppender{
  39. private static final String INDICATOR_URL = "img/lazy.gif";
  40. @Override
  41. protected CharSequence getIndicatorUrl() {
  42. return INDICATOR_URL;
  43. }
  44. }
  45. }

そもそもIndicatingAjaxButtonクラスがMyIndicatingAjaxButton#getWicketAjaxIndicatorAppenderのようなメソッドをが用意していてくれればいいと思うのですがなぜかありません。なぜ??

AjaxLazyLoadPanelで表示される画像を変更する場合

wicket-extentionsのバージョンは1.3.5

AjaxLazyLoadPanelにおいて画像のパスを決定するのはgetLoadingComponentメソッドになります。

  1. public Component getLoadingComponent(String markupId){
  2. return new Label(markupId, "<img src=\"" +
  3. RequestCycle.get().urlFor(AbstractDefaultAjaxBehavior.INDICATOR) + "\"/>").setEscapeModelStrings(false);
  4. }
ですのでAjaxLazyLoadPanelの無名クラスもしくはサブクラスにて下記のようにすれば画像の変更が可能です。
  1. @Override
  2. public Component getLoadingComponent(String markupId) {
  3. return new Label(markupId, "<img src=\"img/lazy.gif\"/>").setEscapeModelStrings(false);
  4. }

この画像のパスはメソッドを呼び出す事で生成するようにするクラスを1つ作成していればより柔軟なクラスが作成できるかと思います。