JOptionPane.showMessageDialog JFrame / JDialog

Tenho um JFrame com uma Tela de cadastro chamo um JDialog como modal dentro deste JDialog chamo um metodo em uma classe que contem uma mensagem

JOptionPane.showMessageDialog(null,"Erro no cadastro.");

O que acontece é que a mensagem só exibida quando fecho o JDialog, ja tentei fazer o seguinte:

JOptionPane.showMessageDialog(this,"Erro no cadastro.");

mas o meu metodo tem que ser static ai da um erro dizendo que o this nao é static.
alguem tem uma ideia
Valeu

Quem chama o JOptionPane é o seu JDialog??

Sim, ele chama o metodo que exibe o JOptionPane

E porque seu método é static?

Entao, mas eu preciso deste metodo static

Em 99% dos casos, você não precisa de um método static. Dá para contar nos dedos quantos desse existem no programa. E mais ainda, quantos deles não são fábricas.

Se seu método for static, você terá que passar por parâmetro o JFrame ou JDialog que está abrindo o JOptionPane, e usa-lo no lugar do this.

Veja minha situação:

public class BemaECF {

   public static void analisaRetorno(){
       switch(iRetorno){
        case  0:
                JOptionPane.showMessageDialog(null, "Erro de Comunicação.");
                break;
        }
   }
}
public class Vendas extends JFrame{
  // Aqui tenho um JButtom que chama o JDialog
}
public class Fechamento extends javax.swing.JDialog {

   public Fechamento(Vendas parent, boolean modal) {
        super(parent, modal);
        this.venda = parent;   // Aqui ja estou passando o JFRame
   }
   // aqui tenho um botao que chama o metodo analisaRetorno()
}

Duvida: qdo chamo este metodo a mensagem fica no JFrame e nao no JDialog, qdo fecho JDialog ai aparece a mensagem “Erro de comunicação”.
o q da pra fazer??
Valeu.

Só com isso que vc postou é difícil dizer. Onde o método estático é chamado? E ele precisa mesmo ser estático? Por que?

post mais coisas!!

mas coloca os principais…pro seu problema!

O METODO ESTA NA CLASSE BEMAECF
ELE É CHAMADO NO JDIALOG
PRECISA POIS TO USANDO UMA DLL DA BEMATECH

    private  void fechaCupomFiscal(){
        BemaECF.fechaCupom("D", 
                           "$", 
                           String.valueOf(vlDesconto),
                           "Volte Sempre",
                           listaFormasPagamento); 
    }

ESTE METODO ESTA NO JDIALOG E O BemaECF.fechaCupom ESTA NA CLASSE BEMAECF

Ahem… acho que seu caps lock deu problema.

rs! pois é
Nesse caso como posso fazer para a mensagem aparecer na frente do JDialog?

Você teria que criar uma versão alternativa para seus métodos:

public static void analisaRetorno(JDialog dialog){ switch(iRetorno){ case 0: JOptionPane.showMessageDialog(dialog, "Erro de Comunicação."); break; } }

Outra alternativa é, ao invés de mostrar os dialogs diretamente na classe, disparar uma Exception:

public static void analisaRetorno() throws BematecException{ switch(iRetorno){ case 0: throw new ErroDeComunicacaoException("Erro de Comunicação."); break; } }

Aí na hora de usar o método:

try { BemaECF.analisaRetorno(); } catch (BematechException e) { JOptionPane.showMessageDialog(this, e.getMessage()); //Aqui vc poderia logar a exception também. }

Eu gosto mais da segunda opção. Ela mantém o texto na camada de view, não forçando que a dll dispare uma JOptionPane. É particularmente útil se vc depois quiser criar um serviço que use essa dll (sem tela gráfica), ou mesmo um método para fazer algo via console.

O Primeiro exemplo nao seria adequado pois uso esse metdo tb no JFrame, pelo que entendi ela ficaria vinculado ao JDialog.

Vou Testar o segundo metodo.

Obrigado.

Pois é, no primeiro caso você teria que criar uma assinatura para o JFrame e outra para o JDialog.