Problema com JDialog modal

9 respostas
T

Ao iniciar um JDialog modal o Construtor não executa as outras linhas

public CadChuva(JDialog frame, boolean modal){ super(frame,modal); cadastro = this.iniciarTela("Cadastro Chuva", formulario, barra); System.out.println("entrou cadchuva"); this.Action(); }

o construtor só executa a linha "super(frame.modal)"
ao fechar a tela de CadChuvas as linhas logo a baixo é executadas.
Mais preciso que seja executado todo o método construtor para iniciar toda a tela.
Como fazer isso?

9 Respostas

T

post duplicado…

ViniGodoy

Tire o setVisible(true) de dentro do construtor da classe pai.

Dica: Nunca coloque o comando setVisible(true) dentro de um construtor.

altitdb

ViniGodoy,

porque você diz para nunca colocar dentro de um construtor??

Eu faço da seguinte maneira:

public CadChuva(JDialog frame, boolean modal){  
     super(frame,modal);  
}  

public CadChuva() {
     initComponents();
     setModal(true);
     setVisible(true);
}

E quando eu chamo o Dialog faço assim:

CadChuva c = new CadChuva();

Tive problemas quando comecei a fazer isso, pois colocava o setVisible antes dos outros metodos que era influenciados na construção, mas depois descobri que basta por ele por ultimo que não tem problema!

xD~~

ViniGodoy

O ideal é fazer assim:

public CadChuva(JDialog frame, boolean modal){  
     super(frame,modal);  
}  

public CadChuva() {
     initComponents();
     setModal(true);
}
E chamar o dialog assim:
CadChuva c = new CadChuva();  
c.setVisible(true);

Por vários motivos:

1. Evita o problema que o autor desse tópico teve. Lembre-se que o método setVisible em dialogs modais trava até que a dialog seja fechada, o que faz que sua dialog seja exibida antes de ser completamente construída!;
2. Permite que quem cria a Dialog escolha se quer abri-la ou não.
3. Permite que você chame outros métodos da Dialog, antes de abri-la:

CadChuva c = new CadChuva();
c.addItemCadastro(i1);
c.addItemCadastro(i2);
c.setVisible(true);

Por essas e outras, não é uma boa prática chamar setVisible no construtor.

altitdb

ViniGodoy,

por exemplo, tenho um Dialog, e nele tenho um metodo limparCampos();

Eu teria que fazer assim:

CadChuva c = new CadChuva();  
c.limparCampos();
c.setVisible(true);

Eu não poderia fazer assim:

CadChuva(){
limparCampos();
}

Sabendo que esse metodo é sempre obrigado a executar quando eu instancio um novo Dialog.

Dessa forma eu poderia evitar que alguem que criasse uma instancia desse Dialog esqueça de chamar o limparCampos();

xD~~

ViniGodoy

Pode sim. O importante é o setVisible() não estar no construtor. Senão vc exibirá o dialog antes dele estar completamente construído.

Sem falar que uma chamada ao super num dialog filho irá gerar o problema que o colega do tópico teve.

T

Como sempre Vini sanando todas minhas duvidas!
realmente desconhecia que o o setVisible(true) travava o jDialog.
Muito obrigado @ViniGodoy por responder meus tópicos com rapidez e eficiência :smiley:

T

ViniGodoy,
tem como ativar no JDialog o minimizar e maximizar?

ViniGodoy

Não tem. Se você realmente precisar de recurso assim, você terá que xunxar seu JFrame:
http://www.jroller.com/santhosh/entry/are_you_missing_maximize_button

Eu realmente não recomendo burlar tanto o comportamento do Swing, pois você tem poucas garantias de código multiplataforma. Infelizmente, ele vem com algumas limitações e essa é uma delas. Se você tem JFrame, você tem os botões, mas não tem nada modal. Se você usa o JDialog, ele é modal, mas não tem maximizar e minimizar.

=(

Criado 25 de janeiro de 2011
Ultima resposta 26 de jan. de 2011
Respostas 9
Participantes 3