Aguardar resposta para tela proposta

6 respostas
D

Olá turma, :smiley:

Tenho que exibir em um painel uma proposta (parecida com aqueles textos de termos de responsabilidade) e esta deve aguardar o usuário responder “sim ou não” ao clicar em um dos botões antes de continuar.
O painel é exibido (inicialmente) assim que o usuário clica no botão “Cadastrar” da classe que exibe o painel. Mas, o que gostaria de fazer?

Gostaria que no código do ActionListener que está escutando as ações do botão “Cadastrar” só continuasse até o final após a resposta do usuário ser escolhida, sendo que a pergunta (painel.setVisible(true):wink: é chamada na linha x deste listener.

Então alguns meninos me deram idéias diferentes, sem sucesso. São elas:

  • Como o painel é um objeto, você só chama o getResposta() para obter a resposta e continuar… não dá certo, pois o programa dá a resposta antes de o usuário selecionar (ou seja, por padrão, sempre falso, executou o código por completo sem esperar).
  • Usa um JDialog… não dá certo, pois quero que a pergunta seja exibida dentro do painel, porém, o JDialog segura o sistema até que um dos botões sejam selecionados, quando modal=true. Daí surge a idéia que preciso: uma espécie de painel modal :idea:
  • Usa uma Thread que aguarda a resposta para executar a atividade que deseja… mas pelas minhas leituras, uma Thread não morre nunca, o que seria inútil pois ela só será usada uma única vez e depois pode-se descartá-la.

:arrow: É bem parecido com o JDialog mas gostaria que o mesmo efeito ocorra em um JPanel. No JDialog com modal verdadeiro o sistema aguarda até que o usuário clique em um dos botões para liberar o resto do processamento. Ex:

  • Método boolean pergunta() é chamado em uma classe x que possui herança JDialog que é construída pelo construtor JDialog(Frame frame, boolean modal);
  • O método foi invocado pela classe y da seguinte forma:

if(metodo()) // faça isso.. else // faça aquilo... endif - Este método tem dois botões “Sim ou não” que ao serem clicados ajustam o valor de retorno para “true ou false”;

  • Então ao clicar em um dos botões, o JDialog seta a variável de retorno do método e se fecha;
  • Aí sim o processamento restante do sistema completa-se e a resposta que o IF estava esperando para continuar chega certinha (conforme selecionada ao clique de um dos botões, o sistema aguardou).

Alguém arrisca uma idéia ?? Sei que a pergunta é enrolada então se alguém ficou confuso com alguma coisa, pergunte, please!
Obrigada, aguardarei!

6 Respostas

R
Realmente está um pouco confuso a pergunta por conta do fluxo.

Pelo que entendi:

1 - Usuário/Cliente clica no botão Cadastrar;

2 - Sistema exibe tela com o texto do termo de responsabilidade;

3 - Usuário responde sim ou não;

4 - Sistema continua processamento da ação do botão Cadastrar;

Seria isto o processo do sistema?
Caso sim suponho que antes de clicar no botão “Cadastrar” o usuário/cliente tenha preenchido algum formulário qualquer e você queira gravar tais informações somente se o mesmo aceitar os termos do produto/serviço;
de uma olhada neste link talvez possa lhe ajudar http://javaprog.net/jwizz/docs/tutorial/tutorial_installwizard.html#id2450486

Vingdel

daniellybifaratte, boa noite!

Por que você não tenta colocar o código que está depois da linha painel.setVisible(true) no botão de resposta do seu painel?

Abraço!

D

Olá Rubem e Vingdel, :smiley:

<blockquote><div class="quote-author">rubem_vieira:</div>1 - Usuário/Cliente clica no botão Cadastrar;

2 - Sistema exibe tela com o texto do termo de responsabilidade;

3 - Usuário responde “sim” ou “não”;

4 - Sistema continua processamento da ação do botão Cadastrar;

</blockquote>

O fluxo é esse mesmo, está correto.  que gostaria após exibir o painel e o usuário ter clicado em algum dos botões, obter o valor correto que o usuário escolheu.  <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/f.pngrowning.png?v=9" title=":frowning:" class="emoji" alt=":frowning:">

O que acontece de errado neste momento: o Listener que escuta o botão Cadastrar, assim que recebe um evento, executa um painel.setVisible(true); e na próxima linha tem um if(painel.getResposta()). O problema é que o código não aguarda o usuário clicar em um botão. Ao clicar em cadastrar, ele exibe o painel e  em seguida cai para a próxima linha que é pegar o valor retornado por getResposta() e verificar se é verdadeiro ou falso. O que acontece? A resposta é sempre false, que é o valor defalult de getResposta(). O código precisa aguardar a resposta do clique em um dos botões do painel que está sendo exibido para continuar ou até mesmo após um painel.setVisible(false) para que  sim ele pegue o valor real (e não default) para tomar o caminho certo do if em diante, entenderam meninos?  :-o

Mais sugestões para conseguir resolver serão bem vindas! Obrigada pela atenção. :smiley:

aix

fake, agora virou moda fazer conta com foto de menina

http://www.vibeflog.com/manujq/p/22250514

Vingdel

Posta o código aqui pra ver se podemos ajudar.

Abraço!

rogeriopaguilar

Como você quer que seja na mesma tela, você poderia utilizar o glasspane, que é tipo um painel invisível por default que, quando visível, bloqueia a entrada dos controles do contentpane. Tem um exemplo aqui:

http://www.java2s.com/Code/Java/Swing-Components/GlasspanePainting.htm

e aqui:

http://www.java2s.com/Code/Java/Swing-JFC/Showhowaglasspanecanbeusedtoblockmouseandkeyevents.htm

No caso você teria que substituir a barra de progressão pelos seus botões e o que mais quiser nele, e quando o usuário clicar, deixar novamente ele invisível.
Ele funciona como se fosse um “painel modal”, que pelo que entendo é o que você quer.

Criado 21 de janeiro de 2012
Ultima resposta 21 de jan. de 2012
Respostas 6
Participantes 5