Tela gráfica incremental no Java

8 respostas
java
Ale_Fonseca

Estou apanhando com a seguinte situação:

Estou criando um programa reativo a um conjunto de respostas, onde, após cada opção selecionada, novas questões irão surgir, ou seja, a tela irá incrementado a cada questão realizada.

Exemplo:

Imagine um JFrame com apenas uma label e dois botões aparecendo:

lbl1 "Qual o seu sexo?"
btn1 "Masculino" btn2 "Feminimo"

Apos a pessoa clicar no botão “masculino”, abaixo aparecerá alguma lbl nova com mais duas opções.

Exemplo:

lbl2 "Olá nobre rapaz, vc é maior de idade?"
btn3 "Sim" btn4 "Não".

E assim vai, ou seja, no final eu terei uma tela com um rolamento informando todas as opções que eu fiz desde o começo. Sendo que tudo começou com apenas uma pergunta na tela?

Não consegui fazer isso funcionar?

8 Respostas

D

O seu problema é na contrução da Tela ou da estrutura do programa?

Tem várias estratégias que vc pode usar, eu faria o seguinte:

class Pergunta {
  String pergunta;
  String idResposta;
  String[] opcoesDeRespostas;
  ConstrutorDePergunta construtor;

  String construirPergunta(Map<String, String> respostas) {
    return construtor.construir(pergunta, respostas);
  }
}

interface ConstrutorDePergunta {
  String construir(String pegunta, Map<String, String> respostas);
}

então para testar:

void main(){

  Pergunta p = new Pergunta(
    "Olá %Sexo%, vc é maior de idade?",
    "MaiorIdade",
    new String[]{"Sim", "Não"},
    new ConstrutorDePergunta(p, r){
      String sexo = r.get("Sexo");
      switch(sexo) {
        case "Masculino": return p.replaceAll(%Sexo%, "rapaz");
        case "Feminino": return p.replaceAll(%Sexo%, "moça");
      }
  });

  Map<String, String> respostas = new HashMap<>()

  println("Teste masculino");
  respostas.put("Sexo", "Masculino");
  println(p.construirPergunta(respostas));

  println("Teste feminino");
  respostas.put("Sexo", "Feminino");
  println(p.construirPergunta(respostas));
}

Na tela

JPanel construirPergunta(Pergunta p, Respostas r) {
  JPanel p = new JPanel(new FlowLayot())
  p.add(new JLabel(p.construiPergunta(r)));
  // cria botao com a opcao de respsota 0
  p.add(construirBotoes(p.idResposta, p.opcoesDeRespostas[0], r))
  // cria botao com a opcao de resposta 1
  p.add(construirBotoes(p.idResposta, p.opcoesDeRespostas[1], r))
}

JButton construirBotoes(String id, String opt, r) {
  JButton botao = new JButton(opt);
  botao.addActionListener(new ActionListener(){
    void actionPerformed() {
      // coloca a resposta da pergunta no map de respostas
      r.put(id, opt);
      // exibe proxima pergunta
      exibirProximaPergunta();
    }
  });
  return botao;
}
igor_ks

Isso tem a ver com inteligencia artificial? Se sim, tem formato de arvore binária, com estrutura de Pai, Nó direito, Nó esquerdo, e recursividade.

Ale_Fonseca

Opa!!!

Muito obrigado pela ajuda Diego!

A ideia é “simular” uma conversa de sms ou de whatsapp, por isso preciso que as labels fiquem ocultas e só apareça aquelas que for performada pelo botão escolhido.

Vou dar uma estudada no seu codigo e testar no meu!

Ale_Fonseca

Vou dar uma pesquisada neste tipo de estrutura!

Inicialmente não diria que é um IA. Porém, o princípio, mesmo sendo rudimentar, é proximo a isso!

Jonas_B_a_r_r_o_s

Você quer que ao responder uma pergunta, surja uma outra no mesmo JFrame, desaparecendo a anterior?

Você pode criar um Label static, colocar dentro do JFrame.
Depois crirar um metodo para uma pergunta. Ao terminar de responder, clicando no botao, a ação desse botão executa outro metodo, o metodo da segunda pergunta, que terá o Label modificado label.setText(“pergunta 2”); no mesmo JFrame. E no caso dos botões pode fazer a mesma coisa. Só a estrutura interna, digo dos valores para as perguntas/respostas você implementa em cada metodo.

O que acha?

Ale_Fonseca

Boaaaa isso mesmo!

Essa era a idéia! Vlwwwww!

Mas agora, não sendo abusado…

E se eu quiser fazer um efeito de “conversa”, ou seja, ao responder, aquele label e botões sobem uma linha e aparece uma pergunta embaixo… tipo uma conversa SMS…

É muito complicado? É que assim eu teria o “histórico” do que foi selecionado!

Jonas_B_a_r_r_o_s

Não é complicado. Inclusive eu tenho aqui algo bem parecido a isso. É um programa de chat, tem o cliente e o servidor. Fiz para ser executado em uma rede.Na verdade era para também funcionar pela internet só que eu não dei proseguimento, teria que fazer só alguns ajustes no socket, URL etc.

O programa visualmente é bem simples. Um JFrame, onde as conversas aparecem em uma JTextArea, tem um botão enviar e um JTextField para escrever a mensagem.

Poderia pensar na possibilidade de adaptar para fazer esse quiz.Por ex: em uma JTextArea para exibir o quiz ficaria bem melhor do que você colocar simplemente num label, porque ficaria bem mais flexivel. E no caso, de você ter o historico, você pode colocar tudo para ser gravado num arquivo, por exemplo um .txt

A ideia do label das perguntas seria a mesma, você vai setando conforme você pressionar o botão de resposta. Assim que responder, a resposta irá aparecer na JTextArea

No seu quiz, as respostas é apenas SIM ou Não?

Ale_Fonseca

A quantidade de respostas dependerá da pergunta… Pode acontecer de ter mais de duas respostas. Dependendo da “conversa virtual” as perguntas ficarao mais complexas e com mais possibilidades

Criado 17 de julho de 2016
Ultima resposta 21 de jul. de 2016
Respostas 8
Participantes 4