0

ユーザーが製品をクリックするとモーダルウィンドウが製品名で開くプロジェクトを作成しています。また、パネル内のモーダル ウィンドウに製品画像を含めたいと考えています。画像はサーバーのディレクトリに保存されます。

私はこのリンクを参照しています

私のパネルHTMLコードは次のようになります http://wicketinaction.com/2011/07/wicket-1-5-mounting-resources/

ItemOrderPanel.html

        <div>
            <li><a wicket:id="link"></a></li>
        </div>

ItemOrderPanel.java

    final ResourceReference imageResourceReference = new ImageResourceReference();
    String imageName = itm.getProductImage();
    final PageParameters parameters = new PageParameters();
    parameters.set("name", imageName);
    CharSequence urlForImage = getRequestCycle().urlFor(imageResourceReference,parameters);
    ExternalLink link = new ExternalLink("link", urlForImage.toString());
    link.setBody(Model.of(imageName));
    add(link);

WicketApplication.java 内

mountResource("/orderPage/{name}",new ImageResourceReference());

WicketApplication.java のこの行に疑問があります。

このようなリソースファイルを作成しました

ImageResourceReference.java

public class ImageResourceReference extends ResourceReference{

public ImageResourceReference(){
    super(ImageResourceReference.class,"imagesDemo");
}

@Override
public IResource getResource() {
    return new ImageResource();
}

private static class ImageResource extends DynamicImageResource{

    private static final long serialVersionUID = 1L;

    @Override
    protected byte[] getImageData(Attributes attributes) {
        PageParameters parameters = attributes.getParameters();
        StringValue name = parameters.get("name");

                    byte[] imageBytes = null;
        if(name.isEmpty() == false)
            imageBytes = getImageAsBytes(name.toString());

        return imageBytes;
    }

    private byte[] getImageAsBytes(String label){
        BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = (Graphics2D) image.getGraphics();
        g.setColor(Color.BLACK);
        g.setBackground(Color.WHITE);
        g.clearRect(0, 0, image.getWidth(), image.getHeight());
        //g.setFont(new Font("SansSerif", Font.PLAIN, 48));
        g.drawString(label, 50, 50);
        g.dispose();

        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpeg");
        ImageWriter writer = writers.next();
        if (writer == null) {
            throw new RuntimeException("JPG not supported?!");
        }

        final ByteArrayOutputStream out = new ByteArrayOutputStream();

        byte[] imageBytes = null;
        try {

            ImageOutputStream imageOut = ImageIO.createImageOutputStream(out);
            writer.setOutput(imageOut);
            writer.write(image);
            imageOut.close();
            imageBytes = out.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return imageBytes;


    }

    @Override
    public boolean equals(Object that){
        return that instanceof ImageResource;
    }

}

}

しかし、コードをデバッグすると、バイトを返す内部ImageResource クラスに制御が来ていないことがわかりました。

イメージ画像をパネルに表示したい。そして、私のパネルに表示されているリンクは、ローカルシステムのデータベースに保存したリンクです。

どんな助けやアドバイスも大歓迎です!前もって感謝します。

4

4 に答える 4

4

最後に、ItemOrderPanel.java のこのコードに落ち着きました

add(new NonCachingImage("img", new AbstractReadOnlyModel<DynamicImageResource>(){
          @Override public DynamicImageResource getObject() {
            DynamicImageResource dir = new DynamicImageResource() {
              @Override protected byte[] getImageData(Attributes attributes) {
                  StringValue name = parameters.get("name");
                  byte[] imageBytes = null;
                    if(name.isEmpty() == false)
                        imageBytes = getImageAsBytes(name.toString());

                    return imageBytes;
              }
            };
            dir.setFormat("image/png");
            return dir;
          }
        }));

private byte[] getImageAsBytes(String label){
    byte[] imageBytes = null;
    try {
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            InputStream inStream  = new FileInputStream(new File(label));
            copy(inStream, outStream);
            inStream.close();
            outStream.close();
            return outStream.toByteArray();

        } catch (IOException e) {
            e.printStackTrace();
          } 
     return imageBytes;


}

private void copy(InputStream source, OutputStream destination)
        throws IOException
    {

        // Transfer bytes from source to destination
            byte[] buf = new byte[1024];
            int len;
            while ((len = source.read(buf)) > 0) {
                destination.write(buf, 0, len);
            }
            source.close();
            destination.close();

    }
于 2012-12-24T04:49:13.407 に答える
1

問題は、ImageResourceReferenceの2つの異なるインスタンスを作成することだと思います(これは元の記事でも問題だと思います)。だから私はあなたのItemOrderPanel.javaで次のことをします:

WebApplication.get().
        getResourceReferenceRegistry().
        getResourceReference(
            ImageResourceReference.class,
            "imagesDemo",
            null,
            null,
            null,
            true,
            false)

また、「orderPage」よりも優先度が高い可能性のある「/」など、非常に一般的なURLで他のリソースやページをマップしていないことを確認してください。以下のWikiページによると:

IRequestMapper.getCompatibilityScore(Request)が大きいマッパーが最初に要求されます。

詳細については、このページをご覧ください: Wicketでのリクエストマッピングの仕組み

それならうまくいくはずです!;)

于 2012-12-24T02:01:41.433 に答える
1

DynamicImageResourceを使用して、画像をバイト単位で取得します。

于 2012-12-20T13:26:43.977 に答える
0

https://cwiki.apache.org/WICKET/uploaddownload.html

ここでいくつかの情報を見つけることができます。

于 2012-12-20T15:10:02.253 に答える