JDialog não Carrega

Boa tarde caros amigos,
estou tendo problemas ao chamar um JDialog a partir de um evento de um JButton
o comando que está no envento é o seguinte:

try { SalvandoDialog salvandoDialog = new SalvandoDialog(null); salvandoDialog.setVisible(true); Thread.sleep(5000); salvandoDialog.dispose(); } catch (Exception e) { e.printStackTrace(); }
É criada uma classe SalvandoDialog que extende a java.awt.Dialog, ela não é modal para que eu possa manipulá-la como vocês estão vendo no código acima.
Ela funciona como uma janela splash tipo “Salvando…”, para eu indicar o status de algumas operações no meu sistema e que o usuário não pense que ele está travado.
Porém, ele não carrega normalmente. Os componentes (label, progressbar, panel, …) que deviam ser criados nele não aparecem, ele somente carrega, fica os cinco segundos aparecendo e fecha, assim como descrito no código acima.

Alguém ai tem alguma idéia do que ocorre???

Oi,

Imagino o que pode estar acontecendo…

Post a sua classe da janela SalvandoDialog.

Tchauzin!

Bom dia…^^
essa é a minha classe

public class SalvandoDialog extends java.awt.Dialog {

    static JLabel jLabelMessage;
    static JLabel jLabelIcon;
    static JPanel jPanel1 = new JPanel();
    static JPanel jPanel2 = new JPanel();
    public JProgressBar jProgressBar = new JProgressBar();

    /** Creates new form MessageDialog */
    public SalvandoDialog(java.awt.Frame parent) {

        super(parent, ModalityType.APPLICATION_MODAL);
        //super(parent);

        this.montaMensagem();

        pack();

        Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();

        this.setLocation((int) ((dimension.getWidth() / 2) - (this.getWidth() / 2)), (int) ((dimension.getHeight() / 2) - (this.getHeight() / 2)));

    }

    public void montaMensagem() {

        this.setTitle("Salvado");

        this.remove(jPanel1);
        this.remove(jPanel2);

        if (jLabelMessage != null) {
            jPanel1.remove(jLabelMessage);
        }


        jPanel1.setLayout(new FlowLayout(FlowLayout.CENTER));
        jPanel2.setLayout(new FlowLayout(FlowLayout.CENTER));

        jLabelMessage = new JLabel("Salvando.");
        jLabelIcon = new JLabel();

        Icon icon = new ImageIcon(ClassLoader.getSystemResource("\\imagens\\salvando_small.gif"));

        jLabelIcon.setIcon(icon);

        setLayout(new GridLayout(2, 1));

        jPanel1.add(jLabelMessage);
        jPanel1.add(jLabelIcon);

        jPanel2.add(jProgressBar);

        jPanel1.setBackground(Color.WHITE);
        jPanel2.setBackground(Color.WHITE);

        this.add(jPanel1);
        this.add(jPanel2);
    }

    public static void showMessage() {
        SalvandoDialog sd = new SalvandoDialog(null);
        System.out.println("inicio");
        sd.setVisible(true);
        try {
            System.out.println("inicio");
            Thread.sleep(5000);
            System.out.println("fim");
            sd.dispose();
        } catch (InterruptedException ex) {
            Logger.getLogger(SalvandoDialog.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public JLabel getjLabelMessage() {
        return jLabelMessage;
    }

    public JPanel getjPanel1() {
        return jPanel1;
    }

    public JPanel getjPanel2() {
        return jPanel2;
    }

    public static JLabel getjLabelIcon() {
        return jLabelIcon;
    }

    public JProgressBar getjProgressBar() {
        return jProgressBar;
    }
}

O problema pode estar acontecendo na hora
que vc muda o layout do pane
quando se muda o layout o tamanho dos componentes diminuem sozinho
e vão para o canto superior direito do seu form
as vezes acontece isso.

Oi,

O que pode estar acontecendo:

Como o JDialog não está modal, o compilador irá executar o método sleep da thread antes de terminar de montar os componentes graficos de sua tela.

O que você pode tentar fazer:

Colocar a função sleep dentro de sua tela, depois de montar os componentes graficos.

Tchauzin!

então colocaria o sleep dentro no construtor???

Oi,

Provavelmente sim!
Faz um teste para ver se é realmente isso =)

Tchauzin!

ah…obs:
o JDialog está modal:
no inicio do construtor tem essa linha colocando-o como modal

super(parent, ModalityType.APPLICATION_MODAL);

Caraa…

em vez de

[code]public SalvandoDialog(java.awt.Frame parent) {

     super(parent, ModalityType.APPLICATION_MODAL);  
     //super(parent);  

     this.montaMensagem();  

     pack();  

     Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();  

     this.setLocation((int) ((dimension.getWidth() / 2) - (this.getWidth() / 2)), (int) ((dimension.getHeight() / 2) - (this.getHeight() / 2)));  

 }  [/code]

faz assim:

[code]public SalvandoDialog(java.awt.Frame parent) {

     super(parent, ModalityType.APPLICATION_MODAL);  
     //super(parent);  

     pack();  

     Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();  

     this.setLocation((int) ((dimension.getWidth() / 2) - (this.getWidth() / 2)), (int) ((dimension.getHeight() / 2) - (this.getHeight() / 2)));  

 }  

public SalvandoDialog(){

    montaMensagem();  

}
[/code]

Aconteceu comigo e resolvi desta forma uma vez…

Testa ai!!

xD~~

não deu certo… :frowning:
o sleep só vai fazer demorar um pouco para que o JDialog carregue…
Como ele está modal, não consigo fazê-lo fechar dentro o método no qual eu o chamo. Portanto, ele fica lá aparecendo eternamente e carregando corretamente os componentes.
Quando eu coloco o JDialog como não-modal super(parent, ModalityType.MODELESS);, ai sim consigo fechá-lo atráves do médo no qual eu o chamo, porém os componentes não carregam. :frowning:

altitdb, também não deu certo.
o JDialog não aceita a criação de um construtor dessa forma

public SalvandoDialog() { this.montaMensagem(); }
:frowning:

Oi,

O fato é: Quando um JDialog é modal, ao utilizar o método setVisible(true) a janela ficará “congelada” e não irá executar nenhum método abaixo do setVisible até a janela ser fechada.

Se a sua ideia é criar a janela e depois de um tempo fecha-la, sugiro que controle isso com uma thread dentro da propria janela. Isso fará com que ela rode em paralelo e quando acabar o tempo irá fecha-la.

Tchauzin!

[code]
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

public class SalvandoDialog extends javax.swing.JDialog {

 static JLabel jLabelMessage;
 static JLabel jLabelIcon;
 static JPanel jPanel1 = new JPanel();
 static JPanel jPanel2 = new JPanel();
 public JProgressBar jProgressBar = new JProgressBar();

 SalvandoDialog() {
    montaMensagem();
    setSize(400,400);
 }


 /** Creates new form MessageDialog */
 public SalvandoDialog(java.awt.Frame parent) {

     super(parent, ModalityType.APPLICATION_MODAL);
     //super(parent);

     pack();

     Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();

     this.setLocation((int) ((dimension.getWidth() / 2) - (this.getWidth() / 2)), (int) ((dimension.getHeight() / 2) - (this.getHeight() / 2)));

 }



 public void montaMensagem() {

     this.setTitle("Salvado");

     this.remove(jPanel1);
     this.remove(jPanel2);

     if (jLabelMessage != null) {
         jPanel1.remove(jLabelMessage);
     }


     jPanel1.setLayout(new FlowLayout(FlowLayout.CENTER));
     jPanel2.setLayout(new FlowLayout(FlowLayout.CENTER));

     jLabelMessage = new JLabel("Salvando.");
     jLabelIcon = new JLabel();

     //Icon icon = new ImageIcon(ClassLoader.getSystemResource("\\imagens\\salvando_small.gif"));

     //jLabelIcon.setIcon(icon);

     setLayout(new GridLayout(2, 1));

     jPanel1.add(jLabelMessage);
     jPanel1.add(jLabelIcon);

     jPanel2.add(jProgressBar);

     jPanel1.setBackground(Color.WHITE);
     jPanel2.setBackground(Color.WHITE);

     this.add(jPanel1);
     this.add(jPanel2);
 }

 public static void showMessage() {
     SalvandoDialog sd = new SalvandoDialog(null);
     System.out.println("inicio");
     sd.setVisible(true);
     try {
         System.out.println("inicio");
         Thread.sleep(5000);
         System.out.println("fim");
         sd.dispose();
     } catch (InterruptedException ex) {
         Logger.getLogger(SalvandoDialog.class.getName()).log(Level.SEVERE, null, ex);
     }

 }

 public JLabel getjLabelMessage() {
     return jLabelMessage;
 }

 public JPanel getjPanel1() {
     return jPanel1;
 }

 public JPanel getjPanel2() {
     return jPanel2;
 }

 public static JLabel getjLabelIcon() {
     return jLabelIcon;
 }

 public JProgressBar getjProgressBar() {
     return jProgressBar;
 }

 public static void main(String args[]){
   new SalvandoDialog().setVisible(true);
 }

}[/code]

O que eu fiz, extendi esta classe para javax.swing.JDialog e ela estava como java.awt.dialog
depois criei o metodo SalvandoDialog()

e o metodo principal ali em baixo para testar…

Está aparecendo tudo certinho, comentei as imagens porque não tenho a imagem e talz…

mais ta mostrando tudo certinho…

xD~~

Oi,

Essa foi uma boa observação que não vi.
Não utilize awt =)

Tchauzin!