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.
publicclassSalvandoDialogextendsjava.awt.Dialog{staticJLabeljLabelMessage;staticJLabeljLabelIcon;staticJPaneljPanel1=newJPanel();staticJPaneljPanel2=newJPanel();publicJProgressBarjProgressBar=newJProgressBar();/** Creates new form MessageDialog */publicSalvandoDialog(java.awt.Frameparent){super(parent,ModalityType.APPLICATION_MODAL);//super(parent);this.montaMensagem();pack();Dimensiondimension=Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)((dimension.getWidth()/2)-(this.getWidth()/2)),(int)((dimension.getHeight()/2)-(this.getHeight()/2)));}publicvoidmontaMensagem(){this.setTitle("Salvado");this.remove(jPanel1);this.remove(jPanel2);if(jLabelMessage!=null){jPanel1.remove(jLabelMessage);}jPanel1.setLayout(newFlowLayout(FlowLayout.CENTER));jPanel2.setLayout(newFlowLayout(FlowLayout.CENTER));jLabelMessage=newJLabel("Salvando.");jLabelIcon=newJLabel();Iconicon=newImageIcon(ClassLoader.getSystemResource("\\imagens\\salvando_small.gif"));jLabelIcon.setIcon(icon);setLayout(newGridLayout(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);}publicstaticvoidshowMessage(){SalvandoDialogsd=newSalvandoDialog(null);System.out.println("inicio");sd.setVisible(true);try{System.out.println("inicio");Thread.sleep(5000);System.out.println("fim");sd.dispose();}catch(InterruptedExceptionex){Logger.getLogger(SalvandoDialog.class.getName()).log(Level.SEVERE,null,ex);}}publicJLabelgetjLabelMessage(){returnjLabelMessage;}publicJPanelgetjPanel1(){returnjPanel1;}publicJPanelgetjPanel2(){returnjPanel2;}publicstaticJLabelgetjLabelIcon(){returnjLabelIcon;}publicJProgressBargetjProgressBar(){returnjProgressBar;}}
Vinny
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.
lina
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!
R
rifoguit
então colocaria o sleep dentro no construtor???
lina
Oi,
Provavelmente sim!
Faz um teste para ver se é realmente isso =)
Tchauzin!
R
rifoguit
ah…obs:
o JDialog está modal:
no inicio do construtor tem essa linha colocando-o como modal
não deu certo…
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.
R
rifoguit
altitdb, também não deu certo.
o JDialog não aceita a criação de um construtor dessa forma
public SalvandoDialog() {
this.montaMensagem();
}
lina
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!
altitdb
importjava.awt.Color;importjava.awt.Dimension;importjava.awt.FlowLayout;importjava.awt.GridLayout;importjava.awt.Toolkit;importjava.util.logging.Level;importjava.util.logging.Logger;importjavax.swing.Icon;importjavax.swing.ImageIcon;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JProgressBar;publicclassSalvandoDialogextendsjavax.swing.JDialog{staticJLabeljLabelMessage;staticJLabeljLabelIcon;staticJPaneljPanel1=newJPanel();staticJPaneljPanel2=newJPanel();publicJProgressBarjProgressBar=newJProgressBar();SalvandoDialog(){montaMensagem();setSize(400,400);}/** Creates new form MessageDialog */publicSalvandoDialog(java.awt.Frameparent){super(parent,ModalityType.APPLICATION_MODAL);//super(parent);pack();Dimensiondimension=Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)((dimension.getWidth()/2)-(this.getWidth()/2)),(int)((dimension.getHeight()/2)-(this.getHeight()/2)));}publicvoidmontaMensagem(){this.setTitle("Salvado");this.remove(jPanel1);this.remove(jPanel2);if(jLabelMessage!=null){jPanel1.remove(jLabelMessage);}jPanel1.setLayout(newFlowLayout(FlowLayout.CENTER));jPanel2.setLayout(newFlowLayout(FlowLayout.CENTER));jLabelMessage=newJLabel("Salvando.");jLabelIcon=newJLabel();//Icon icon = new ImageIcon(ClassLoader.getSystemResource("\\imagens\\salvando_small.gif"));//jLabelIcon.setIcon(icon);setLayout(newGridLayout(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);}publicstaticvoidshowMessage(){SalvandoDialogsd=newSalvandoDialog(null);System.out.println("inicio");sd.setVisible(true);try{System.out.println("inicio");Thread.sleep(5000);System.out.println("fim");sd.dispose();}catch(InterruptedExceptionex){Logger.getLogger(SalvandoDialog.class.getName()).log(Level.SEVERE,null,ex);}}publicJLabelgetjLabelMessage(){returnjLabelMessage;}publicJPanelgetjPanel1(){returnjPanel1;}publicJPanelgetjPanel2(){returnjPanel2;}publicstaticJLabelgetjLabelIcon(){returnjLabelIcon;}publicJProgressBargetjProgressBar(){returnjProgressBar;}publicstaticvoidmain(Stringargs[]){newSalvandoDialog().setVisible(true);}}
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~~
lina
Oi,
Essa foi uma boa observação que não vi.
Não utilize awt =)