1

レポート用にSwingフレームワークとJasperReportsを使用してJavaデスクトップベースのアプリケーションを開発しています。JasperViewerが起動し、レポートを保存したいときに、いくつかの問題が発生します。

保存ダイアログでファイルの名前(デフォルトは空白)を設定するにはどうすればよいですか?また、 PDF形式のみを制限するにはどうすればよいですか?

これが私のコードです:

JRBeanCollectionDataSource beanCollection=new JRBeanCollectionDataSource(matakuliahs);

Map<String,Object> map=new HashMap<String, Object>();
map.put("namaMahasiswa", mahasiswa.getNama());

InputStream input=getClass().getResourceAsStream("/reportsederhana/reportsederhana.jrxml");
JasperDesign design=JRXmlLoader.load(input);
JasperReport report=JasperCompileManager.compileReport(design);
JasperPrint jasperPrint=JasperFillManager.fillReport(report, map, beanCollection);
jasperPrint.setName("Laporan "+mahasiswa.getNama()); // it doesn't give the name
JasperViewer.viewReport(jasperPrint,false);
4

2 に答える 2

2

JRViewer保存先のデフォルトの拡張機能を設定するための1つのアイデアは、(インスタンス)からインスタンスを取得する必要がありJasperViewer、次にvoidJRViewerインスタンスでいくつかの保存コントリビューションを設定できることです。をご覧くださいJRViewer.setSaveContributors(JRSaveContributor[] saveContribs)

ファイル名の設定については、よくわかりませんが、をご覧くださいJRViewer.JRViewer(String, boolean)

また、JRViewerJasperViewerのソースコードも確認してください。便利な場合があります。

于 2013-01-28T09:36:13.827 に答える
2

古い投稿ですが、同じ問題が発生しました...

ビューアコンポーネントをnet.sf.jasperreports.view.JRViewerから拡張しました。いくつかのコードレビューの後、外部からファイル名を制御することはできず、「lastFolder」を制御することしかできないことがわかりました。したがって、最後に使用したフォルダがまだ設定されていない場合は、次の方法で設定できます。

 if (lastFolder == null) {
        this.lastFolder = new File(System.getProperty("user.home"));
    }

しかし、それがヒントです。ツールバーのすべてのボタンはパブリックフィールドです。

したがって、私のソリューションでは、保存ボタン(btnSave)のすべてのActionListenerを削除しました。

 for (ActionListener actionListener : this.btnSave.getActionListeners()) {
        this.btnSave.removeActionListener(actionListener);
    }

そして、私自身の実装を追加しました。レポート名と現在のタイムスタンプに応じてファイル名を制御する点が異なるだけで、元のファイルとかなり似ています。

... 
File file = new File(lastFolder.getPath() + System.getProperty("file.separator") + DateTime.now().toString() + "_" + jasperPrint.getName());
...

さらに、事前に選択したファイル拡張子を.jasperprintから.pdfに設定しました。これはより便利です。

...
fileChooser.setFileFilter((FileFilter) saveContributors.get(1));
...

完全なActionListenerコードは次のとおりです。

  this.btnSave.addActionListener(new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setLocale(getLocale());
            fileChooser.updateUI();
            File file = new File(lastFolder.getPath() + System.getProperty("file.separator") + DateTime.now().toString() + "_" + jasperPrint.getName());
            fileChooser.setSelectedFile(file);
            for (int i = 0; i < saveContributors.size(); i++)
                fileChooser.addChoosableFileFilter((FileFilter) saveContributors.get(i));

            if (saveContributors.contains(lastSaveContributor))
                fileChooser.setFileFilter(lastSaveContributor);
            else if (saveContributors.size() > 1)
                fileChooser.setFileFilter((FileFilter) saveContributors.get(1));
            if (lastFolder != null)
                fileChooser.setCurrentDirectory(lastFolder);
            int retValue = fileChooser.showSaveDialog(JasperViewer.this);
            if (retValue == 0) {
                FileFilter fileFilter = fileChooser.getFileFilter();
                file = fileChooser.getSelectedFile();
                lastFolder = file.getParentFile();
                JRSaveContributor contributor = null;
                if (fileFilter instanceof JRSaveContributor) {
                    contributor = (JRSaveContributor) fileFilter;
                } else {
                    int i = 0;
                    do {
                        if (contributor != null || i >= saveContributors.size())
                            break;
                        contributor = (JRSaveContributor) saveContributors.get(i++);
                        if (!contributor.accept(file))
                            contributor = null;
                    } while (true);
                    if (contributor == null)
                        contributor = new JRPrintSaveContributor(jasperReportsContext, getLocale(), null);
                }
                lastSaveContributor = contributor;
                try {
                    contributor.save(jasperPrint, file);
                } catch (JRException ex) {
                    logger.error("Could not save report.", ex);
                    JOptionPane.showMessageDialog(JasperViewer.this, trc("JasperViewer.error.save", "Could not save report."));
                }
            }
        }
    });
于 2014-06-05T05:15:30.460 に答える