Recentemente tive problemas ao usar a classe JasperViewer com Swing.
Com essa classe, que herda de um JFrame, eu não tinha controle modal
da janela do relatório. Isso resultava em problemas quando o usuário
alternava da janela do relatório para a aplicação. Uma forma de resolver
foi usando, ao invés do JasperViewer, o JRViewer(JPanel) e adicionando a
um JDialog.
Ex:
JasperPrint impressao = JasperManager.fillReport(
getClass().getResourceAsStream("jasper/ListaClientes.jasper"),params,con);
JRViewer jv = new JRViewer(impressao);
//Agora sim é modal!
JDialog reportDialog = new JDialog(new javax.swing.JFrame(),true);
//Posiciona no centro, use setSize() para ajustar o tamanho antes!
j.setLocationRelativeTo(null);
//Adiciona o JRViewer a janela
j.add(jv);
j.show();