[RESOLVIDO]Dúvida ao herdar um JDialog

Olá pessoal,

É o seguinte, estou com dúvidas em um código que estou desenvolvendo. A idéia dele era criar um JDialog “genérico”, para padronizar minhas telas de configuração. Aí está o código:

[code]package contrato.view;

import java.awt.Dimension;
import java.awt.Frame;

import javax.swing.JDialog;

public class Configurar extends JDialog{

public Configurar(Frame janela, String titulo){ 
	super(janela);
	setModalityType(ModalityType.DOCUMENT_MODAL);
	setTitle(titulo);
	setLayout(null);
	setPreferredSize(new Dimension(300, 300));
	pack();
	setLocationRelativeTo(null);
	setResizable(false);
	setVisible(true);
}

}
[/code]

A idéia era criar filhos desta classe, com tudo já definido, apenas faltando adicionar os objetos, um exemplo:

[code]package contrato.view;

import java.awt.Frame;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class Sobre extends Configurar{

private static final long serialVersionUID = 1L;

JPanel elementos;
JLabel sobre;

public Sobre(Frame janela, String titulo) {
	super(janela, titulo);
	this.add(getElementos());
}

public JPanel getElementos(){
	elementos = new JPanel();
	elementos.add(getSobre());
	return elementos;
}

public JLabel getSobre(){
	sobre = new JLabel("Teste");
	sobre.setBounds(10, 10, 100, 100);
	return sobre;
}

}

[/code]

Porém o que está acontecendo, é que o processo main “trava” no super da classe filho e só executa o resto quando o JDialog é fechado, ou seja, não é possível adicionar nenhum elemento no JDialog filho (classe Sobre). Alguém poderia me ajudar a contornar este problema?

Dicas de boa prática de programação são bem-vindas, pois sou iniciante e gostaria muito de fazer tudo certinho!! xD

Tire o setVisible(true) do seu construtor. Como o JDialog é modal, o setVisible travará até a janela ser fechada.

Aliás, nunca dê o comando setVisible(true) em construtores de dialogs e frames. Quem deve decidir quando abrir a janela é quem instancia sua janela, não a janela em si.

Obrigado pela resposta!

Ok, retirarei o setVisible do meu construtor, porém a minha dúvida não é em relação ao Modal. O que está acontecendo é que não consigo adicionar itens (como o JLabel Teste) no meu JDialog (classe Sobre), ele simplesmente não aparece.

Você não entendeu.

Quando vc dá o setVisible() no construtor do pai, a janela torna-se imediatamente visível. Isso roda antes do seu add, da classe filha. O comando setVisible fica travado, até que a janela seja fechada.

Depois de fechada, o construtor continua rodando, e vai rodar o seu add da classe filha.

Se retirar o setVisible, o construtor rodará integralmente, como deve ser. Depois, externamente, quem der o setVisible(true) irá fazer isso numa janela totalmente pronta.

Ahh, entendi!! Então qual seria o melhor lugar para colocar o setVisible?? Quando eu instanciá-lo no meu JFrame Principal? Por exemplo new Sobre(Principal.this, “Sobre”).setVisible(true)? Ou posso colocar depois de tudo no construtor do JDialog filho??

Funcionou perfeitamente, muito obrigado pela ajuda!!

É exatamente isso!!
O melhor local para se colocar o setVisible() é quando você instanciar um objeto da classe (JDialog) que você quer que apareça!!
Ou seja, Sobre s = new Sobre (Principal.this, "Sobre").setVisible(true);

vlew :!: :!:

Sim, o setVisible deve ser colocado no momento que quem criou a janela julgar necessário. Isso pode ser logo após o new, ou pode ser muito mais tarde.

Um exemplo disso é quando se cria uma janela muito pesada em memória, para que seja rápido abri-la no sistema. Por exemplo, logo na inicialização da tela principal, carrega-se a janela como uma propriedade, mas só a torna visível quando o menu dessa janela é clicado:

[code]public class JanelaPrincipal extends JFrame {
private JanelaPesada jp = new JanelaPesada(); //Já criei a janela pesada, mas ela ainda é invisível

//Método chamado no actionListener do menu "Abrir janela pesada"
public void showJanelaPesada() {
    jp.setVisible(true); //Mostra a janela. Para o usuário, virtualmente instantaneo.
}

}[/code]

Essa janela poderia ter sido carregada ainda na inialização da aplicação durante a tela de splash.

Enfim. A idéia é sempre é, não faça sua janela ficar visível só porque o programador deu um “new” nela. Deixe que ele chame o comando setVisible explicitamente, no momento que quiser. É melhor para o sistema, e evita bugs com o que você teve.

Isso é o que faz nos jogos?
Carrega tudo na inicialização, faz conexão com o banco de dados e tudo…
Usando só 1 instancia (singleton), para o depois tudo ficar rapido ?

Muito obrigado pelas explicações pessoal! Fiquei um bom tempo quebrando a cabeça com isso!! xD

Um abraço!

[quote=pedroroxd]Isso é o que faz nos jogos?
Carrega tudo na inicialização, faz conexão com o banco de dados e tudo…
Usando só 1 instancia (singleton), para o depois tudo ficar rapido ?[/quote]
Depende do tipo de jogo.
se for o do tipo a la Windows (Janelas por cima de janelas) aí utiliza-se de vários setVisible e dispose()
Se nao, é isso mesmo!!
vlew :!: :!:

Sakei…
Dahora =)

A propósito…
Se o tópico foi resolvido, vá ao primeiro post, clique em Editar, e adicione [RESOLVIDO] no assunto…
Flws !