0

改札のコンポーネントのURLが必要です。ページを使用すると正しく機能しますが、パネルを使用すると機能しません。

public final class ImageP extends Panel {

    public ImageP(String id) {
        super(id);
        List<Mapp> list = Mapp.loadall(); //load image from database
        final Mapp asr = list.get(0);
        ByteArrayResource resource = new ByteArrayResource("image/jpeg", asr.getImage());
        Image image = new Image("img", resource);
        add(image);
        System.out.println(getRequestCycle().urlFor(image, IResourceListener.INTERFACE));
    }
}

このコードは機能せず、例外をスローしますが、パネルの代わりにページを使用すると、getRequestCycle().urlFor(image, IResourceListener.INTERFACE)正しく機能します。

4

1 に答える 1

2

私はあなたが次の例外を持っているに違いない:

java.lang.IllegalStateException: No Page found for component [Component id = img]

これは、RequestCycleオブジェクトが、次の署名を使用してurlFor()メソッドの最初のパラメーターであるコンポーネントのgetPage()メソッドを内部的に呼び出すためです。

urlFor(Component component, RequestListenerInterface interface)

パネルのコンストラクターでメソッドurlFor()を呼び出す場合、パネルはまだページにアタッチされていないため、パネルの子のページを取得することはできません。したがって、Wicketは「素晴らしい例外」をスローします。

この問題を修正するには、コードをパネルのonBeforeRender()メソッドに移動するだけです。そんな感じ:

@Override
protected void onBeforeRender() {
    //
    // ... init resource ...
    //

    Image image = new Image("img", resource);
    addOrReplace(image);
    System.out.println(getRequestCycle().urlFor(image, IResourceListener.INTERFACE));

    super.onBeforeRender();
}

PS Wicket 1.5以降にはRequestCycle.urlFor(component、listener)メソッドがないため、Wicket1.4以前を使用していることも前提としています。ですから、その場合、あなたの質問も私の答えも意味をなさないと思います。

于 2012-10-01T08:49:41.730 に答える