O problema é que o seu metodo de impressão está na thread de tratamento de eventos ( a principal da sua aplicação ).
Dessa forma ela soh retorna depois que o seu metodo de impressão termina, assim sua aplicação fica sem serviços de eventos e desenho de tela.
Para resolver isso vc deve lançar uma thread separada para lidar com a impressão, assim :
class CupomFiscal extends Thread{
public void run(){
try{
imprimeCupom();
}catch( trata exceptions ... ){}
}
}
no seu programa :
......
CupomFiscal cf = new CupomFiscal();
cf.start(); // neste ponto o serviço de impressão irá iniciar-se de forma asíncrona ao resto do programa.
.....
É claro que se deve ter um conhecimento minimo de programação multi-thread, mas isso em Java não é problema.