古い投稿ですが、同じ問題が発生しました...
ビューアコンポーネントを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."));
}
}
}
});