Processamento Lento do Programa

olá, estou com um pequeno problema no meu programa, estou desenvolvendo um aplicativo para processamento de imagens, e ao abrir uma imagens, desenvolvi um codigo para redimensionar a mesma caso a imagem seja maior q a tela do programa, mas após isso meu programa esta ficando com um leve delay, eu imagino q seja pelo if e whiles que o codigo possui, segue abaixo o codigo, se alguem souber alguma outra força de redimensionar a imagem proporiconalmente ou otimizar esse meu codigo eu agradeço.

public void paintComponent(Graphics g) { super.paintComponent(g); desenha(g); }

[code]private void desenha(Graphics g){
/* Função tá muito lenta!!*/

    int imgLargura = jPanel1.getWidth();
    int imgAltura = jPanel1.getHeight();
    if(imagem!=null){          
    Double novaImgLargura = (double) imagem.getWidth();  //imagem é a imagem aberta pelo programa
    Double novaImgAltura = (double) imagem.getHeight();  

    Double imgProporcao = null;  
    if (novaImgLargura >= imgLargura) {  
        imgProporcao = (novaImgAltura / novaImgLargura);  
        novaImgLargura = (double) imgLargura;  
        novaImgAltura = (novaImgLargura * imgProporcao);  
        while (novaImgAltura > imgAltura) {  
            novaImgLargura = (double) (--imgLargura);  
            novaImgAltura = (novaImgLargura * imgProporcao);  
        }  
    } else if (novaImgAltura >= imgAltura) {  
        imgProporcao = (novaImgLargura / novaImgAltura);  
        novaImgAltura = (double) imgAltura;  
        while (novaImgLargura > imgLargura) {  
            novaImgAltura = (double) (--imgAltura);  
            novaImgLargura = (novaImgAltura * imgProporcao);  
        }  
    }                 
        
        int x = (jPanel1.getWidth() - imagem.getWidth()) / 2;
        int y = (jPanel1.getHeight() - imagem.getHeight()) / 2;
        if(imagem.getWidth() <= jPanel1.getWidth() || imagem.getHeight() <= jPanel1.getHeight() ){
         g.drawImage(imagem.getScaledInstance(novaImgLargura.intValue(), novaImgAltura.intValue(), 100), x, y, imagem.getWidth(), imagem.getHeight(), null);
        }
        else {
         g.drawImage(imagem.getScaledInstance(novaImgLargura.intValue(), novaImgAltura.intValue(), 100), 0, 0, jPanel1.getWidth(), jPanel1.getHeight(), null);
        }
        
       g.dispose();
       jPanel1.repaint();
    }
        
}[/code]