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 já
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.