Re:JDialog personalizado

2 respostas
V

Kra eu nunca vi nenhuma solução pra esse problema !
Eu inclusive gostaria de ver qual a sugestão que o pessoal vai lhe dar .
Eu particularmente faço da seguinte forma :

A minha jDialog tem uma variavel privada do tipo que eu quero retornar .
Essa váriavel é iniciada com null .

o OK da janela executa alguma rotina que eu precisar grava a variavel e da
dispose na janela .

No local onde eu chamo o Dialog , fica algo como :

jDialog dialog = new jDialog(Entrada);

dialog.setVisible(true);

variavelLocal = dialog.getVariavel();

Ja monitorei a memória e aparentemente o garbageCollector trata de destruir o dialog .

Acho que daria também pra passar algum objeto como parametro e a dialog então grava as devidas alterações
nele , então depois seria só trabalhar com esse objeto ( acabei de ter essa idéia nunca usei)

2 Respostas

Luiz_Rocha

Queria fazer da classe JanNumeroQuestoes uma janela que
retornasse int[], assim como um JDialog retorna um valor qualquer.
Não consegui encontrar uma maneira plausível, mesmo estudando o código da classe
JDialog. Na tentativa de implementar uma solução personalizada, obtive falhas.

Solução personalizada:
Método "public static int[] mostrarDialogo()", que chama o construtor (privado) da
classe JanNumeroQuestoes. Ele instanciaria a janela, a tornaria visível e entraria
num loop "while( janela.isVisible() );//espera" que seguraria a linha de execução
até a janela desaparecer - quando o usuário clicasse em Ok. A seguir,
retornaria o valor do método "getResultado()" dessa janela.

	Fato Problemático da Solução:
Quando chamava o método "JanNumeroQuestoes.mostrarDialogo()" direto do método main
tudo ocorria perfeitamente, mas quando esse método era chamado pelo clique em um
botão de outra janela, a instância de JanNumeroQuestao não iniciava corretamente: a
borda da janela era desenhada, mas o interior não era pintado. O programa travava na
linha da instrução "while( janela.isVisible() );//espera".

	Solução:
Após algumas tentativas de alternativas pouco importantes, resolvi apelar para uma
maneira mais primitiva: dispus a classe a ser instanciada publicamente e o botão Ok 
a ser obtivo por um método get. Assim, quando a janela for usada por outra, o botão
Ok deve ser obtido pelo get e um novo ActionListener deve ser adicionado a ele. Esse
ActionListener, no seu método actionPerformed, deve tratar de obter o int[] (pelo
método "JanNumeroQuestoes.geResultado()" e usá-lo para o que quiser.
Foi frustrante, mas a janela não travou mais.

	Novo problema:
Constatado que a janela não travou mais, me daparei com um novo problema: quando eu 
adicionava um novo ActionListener ao botão Ok, estava acrescentando um ao que ele 
tinha. O ActionListener original desse botão, interno à classe JanNumeroQuestoes, 
trata de gerar o int[] que deve ser retornado aos objetos usuários da janela.
No entanto, verificando que o resultado era sempre um int[] preenchido com zeros, 
constatei que o ActionListener externo à classe (o sugerido na solução acima) agia 
antes do interno - ou seja, eu estava obtendo o int[] do objeto antes de ele ser 
gerado. Agora não vejo muita solução. Como alterar a ordem de execução dos 
ActionListeners de um botão?

	Solução temida:
A única luz que me vem é chamar o método privado que gera o int[] externamente à 
classe JanNumeroQuestoes, antes de obter esse int - ou seja, torná-lo público e
fazê-lo retornar o array desejado. Mas isso seria o fim! Esse método deveria ser 
transparente aos usuários de JanNumeroQuestoes! Ele executa uma tarefa interna!
Enquanto não encontrar outra saída vou implementar isso, ainda mais frustado.

** Solução temida resolveu o problema com sucesso.

Mesmo assim, eu gostaria muito de implementar uma janela que fosse como um JDialog: retornando um valor ao objeto que a chamou quando receber uma certa entrada do usuário (um clique num botão, por exemplo).

Se alguém puder me ajudar, eu ficarei muito agradecido.

Luiz_Rocha

Acabei fazendo o seguinte: dispus o botão Ok através de um get. A classe que chama o meu “dialog” instancia esse objeto, obtém o Ok pelo get e adiciona um ActionListener a ele.

jnq = new JanNumeroQuestoes();
		jnq.setVisible(true);
		
		jnq.getBotaoOk().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				numeroDeQuestoesEscolhido();
			}
		});

No metodo numeroDeQuestoes escolhido eu chamo

private void numeroDeQuestoesEscolhido() {
		//recebendo o numero de questoes de cada dificuldade
		this.numQuestoes = jnq.getResultado();
		// Montando a frase do botao
		this.numQuest.setText(jnq.geraFrase());		
}

Foi meio frustrante, mas eu precisava resolver o problema rapidamente. Pelomenos funciona…

Criado 15 de outubro de 2008
Ultima resposta 23 de out. de 2008
Respostas 2
Participantes 2