4

データ ソースを BeanItemContainer に設定したテーブルを作成しました。各 Bean には、名前 (文字列) と、byte[] に変換されたファイルを保持する byte[] があります。最初にファイルをpdfに変換してダウンロードすると思われるボタンを各行に追加しました。ダウンロード部分の実装に問題があります。関連するコードは次のとおりです。

public Object generateCell(Table source, Object itemId,
                Object columnId) {
            // TODO Auto-generated method stub
            final Beans p = (Beans) itemId;

            Button l = new Button("Link to pdf");
            l.addClickListener(new Button.ClickListener() {

                @Override
                public void buttonClick(ClickEvent event) {
                    // TODO Auto-generated method stub

                    try {
                        FileOutputStream out = new FileOutputStream(p.getName() + ".pdf");
                        out.write(p.getFile());
                        out.close();

                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
            l.setStyleName(Reindeer.BUTTON_LINK);

            return l;
        }


    });

したがって、getFile は Bean からバイト配列を取得します

4

2 に答える 2

9

Vaadin 7 を使用している場合は、https ://vaadin.com/forum#!/thread/2864064 の説明に従ってFileDownloader拡張機能を使用できます。

clicklistener を使用する代わりに、代わりにボタンを拡張する必要があります。

Button l = new Button("Link to pdf");
StreamResource sr = getPDFStream();
FileDownloader fileDownloader = new FileDownloader(sr);
fileDownloader.extend(l);

StreamResource を取得するには:

private StreamResource getPDFStream() {
        StreamResource.StreamSource source = new StreamResource.StreamSource() {

            public InputStream getStream() {
                // return your file/bytearray as an InputStream
                  return input;

            }
        };
      StreamResource resource = new StreamResource ( source, getFileName());
        return resource;
}
于 2013-07-02T13:02:42.133 に答える
3

生成された列の作成についてはBook of Vaadin で詳しく説明されています。コードの修正の 1 つは、columnId または propertyId をチェックして、右側の列にボタンを作成することを確認することです。現在、任意の列のボタンを返すようです。

このようなもの:



    public Object generateCell(CustomTable source, Object itemId, Object columnId)
    {
        if ("Link".equals(columnId))
        {
            // ...all other button init code is omitted...
            return new Button("Download");
        }
        return null; 
    }

ファイルをダウンロードするには:



    // Get instance of the Application bound to this thread
    final YourApplication app = getCurrentApplication();
    // Generate file basing on your algorithm
    final File pdfFile = generateFile(bytes);
    // Create a resource
    final FileResource res = new FileResource(pdfFile, app);
    // Open a resource, you can also specify target explicitly - 
    // i.e. _blank, _top, etc... Below code will just try to open 
    // in same window which will just force browser to show download
    // dialog to user
    app.getMainWindow().open(res);

リソースの扱い方の詳細については、Book of Vaadin を参照してください

于 2013-07-02T06:05:23.440 に答える