JDialog não pinta componentes

6 respostas
Marck

Olá!

Criei um JDialog personalizado para meu sistema.
O problema está na hora de mostra-lo.

Se eu colocar um botão em uma tela e chama-lo diretamente funciona e mostra tudo certinho.

Quanto chamo dentro de evento, o JDialog não aparece. Se minimizo a tela e volta, ele aparece, mas sem repintar os componentes.
O mais estranho é que o mesmo acontece se eu utilizar um JOptionPane.

Alguém sabe como resolvo isso?

Obrigado

6 Respostas

ViniGodoy

Pode postar o código do local onde você abre o JDialog?

Marck

Bom dia ViniGodoy

Segue:

public MessagePanel()
{
        super(MDIParent.getFrames()[1], true); //MDIParent.getFrames()[1] retorna um JFrame q está por baixo de um JDesktop
        setUndecorated(true);
        initComponents();

        setDefaultCloseOperation(MessagePanel.DISPOSE_ON_CLOSE);
}

Este é o metodo que chamado p mostrar o JDialog:

public static MessagePanelReturn showPanel(JInternalFrame frameParent, String message, String panelTitle, MessagePanelButtons button, MessagePanelIcons icon)
    {

        final MessagePanel panel = new MessagePanel();
        
        //<editor-fold defaultstate="collapsed" desc="Posiciona frame. Coloca mensagem, titulo e ícone">
        if(frameParent != null){

            int xloc = frameParent.getX() + (frameParent.getWidth() / 2) - (panel.getWidth()/2);
            int yloc = frameParent.getY() + (frameParent.getHeight() / 2) - (panel.getHeight()/2);
            panel.setLocation(xloc, yloc);
        }
        else
        {
            Dimension dim = MDIParent.getDesktopPaneOrq1().getSize();
            Rectangle abounds = panel.getBounds();
            panel.setLocation((dim.width - abounds.width) / 2, (dim.height - abounds.height) / 2);
        }
        
        jTextArea1.setText(message);
        jlTitulo.setText(panelTitle);
        //</editor-fold>

        //<editor-fold desc="Verifica qual ícone será mostrado">
        switch(icon)
        {
            case ERRO:
            {
                jIcon.setIcon(iconErro);
                break;
            }

            case INFORMATION:
            {
                jIcon.setIcon(iconInformation);
                break;
            }

            case QUESTION:
            {
                jIcon.setIcon(iconQuestion);
                break;
            }

            case SUCCESS:
            {
                jIcon.setIcon(iconSucess);
                break;
            }

        }
        //</editor-fold>

        //<editor-fold desc="Verifica quais botões serão mostrados">
        switch(button)
        {
            case OK:
            {
                jPanel2.add(jbOk);
                break;
            }

            case YESNO:
            {
                jPanel2.add(jbYes);
                jPanel2.add(jbNo);
                break;
            }

            case YESNOCANCEL:
            {
                jPanel2.add(jbYes);
                jPanel2.add(jbNo);
                jPanel2.add(jbCancelar);
                break;
            }
        }
        //</editor-fold>

        //<editor-fold desc="Coloca action listeners nos botões">
        jbOk.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                return_ = MessagePanelReturn.OK;
                panel.setVisible(false);
            }
        });
        
        jbYes.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                return_ = MessagePanelReturn.YES;
                panel.setVisible(false);
            }
        });
        
        jbNo.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                return_ = MessagePanelReturn.NO;
                panel.setVisible(false);
            }
        });
        
        jbCancelar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                return_ = MessagePanelReturn.CANCEL;
                panel.setVisible(false);
            }
        });
        //</editor-fold>
        panel.setVisible(true);
        return return_;
    }

Esta é a chamada:

addFormActionEventListener(new FormActionEventListener() {
        
            public boolean beforeSalve() {

                MessagePanelReturn ret = MessagePanel.showPanel(OrdemCarregamentoFormConferencia.this, "Deseja Finalizar esta Ordem de Carregamento?",
                        "Finalizando Ordem de Carregamento", MessagePanelButtons.YESNO, MessagePanelIcons.QUESTION);
                return ret == MessagePanelReturn.YES;
            }

            public boolean afterSalve() {
                return true;
            }
        });

Obrigado pela ajuda!

Marck

ViniGodoy

Será que voce poderia me dar uma força com isso cara? Já li um post no seu blog sobre este assunto mas ainda não consegui resolver.
Mesmo utilizando o EventQueue.invokeLater ou o invokeAndWait não dá certo!

Obrigado.

ViniGodoy

Cara, seu código está meio confunso, eu realmente não pude identificar o problema. Esse comportamento não é normal.

E coisas assim acontecem geralmente quando uma exception é disparada ou quando algo trava o processamento da thread do Swing.

Marck

Olá ViniGodoy

Obrigado pelo retorno.

Pelo que percebi, o JDIalog não pinta corretamente quando está dentro de algum Evento do Form.
Por exemplo, no meu internalform roda uma Evento chamado beforeSalveEvent que é disparado quando o usuario clica no botão salvar que está em um JFrame que contém este internalform. Se eu chamar o JDialog em qualquer outro lugar, ele é mostrado corretamente. O problema está só em chamá-lo dentro de algum Evento.
Não tenho certeza, mas talvez haja algum problema com a classe interna q passo no evento.

//evento do internalframe
addFormActionEventListener(new FormActionEventListener() {

            public boolean beforeSalve() {

                JOptionPane.showMessageDialog(OrdemCarregamentoFormConferencia.this, "Teste"); //componente não é pintado na corretamente

                return true;
            }


        });

Bom, vou continuar procurando aqui!

Mais uma vez, obrigado!

Marck

Olá!

Enfim consegui resolver o problema.

Vou tentar descrevê-lo:
A chamada ao meu método estava sendo feita em outra Thread.
Acontece que eu chamo uma Thread para enviar os dados ao banco e não travar caso o usuário precise abrir outra tela. O JDialog estava sendo chamado em um evento dentro desta Thread. Troquei a chamada para fora da Thread e funcionou.

abraço!

Criado 22 de maio de 2010
Ultima resposta 4 de jun. de 2010
Respostas 6
Participantes 2