[Resolvido] Problema com loop do Menu + Classes - Main [Resolvido]

13 respostas
H

E ae pessoal,

salve salve, há um tempo atrás eu pedi ajuda para criar a minha classe computador (já resolvido, vlw galera!)

agora está com outro bug o meu projeto :?

package TestaProjeto;
import javax.swing.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {

        int escolha = 0;

        Computador pc = new Computador();
        Cliente c = new Cliente();
        Promocao promo = new Promocao();

        while (escolha !=6){
           escolha = Integer.parseInt(JOptionPane.showInputDialog("Menu:"
               + "\n1- Computador"
               + "\n2- Clientes"
               + "\n3- Promoções"             
               + "\n6- Sair"));
           switch (escolha){
               case 1:
                   pc.menuComputador();
                   break;
               case 2:
                   c.menuCliente();
                   break;
               case 3:
                   promo.menuPromocao();
                   break;               
            }

        }
    }
}

O erro é o seguinte, se vc iniciar o programa e escolher cada variável apenas 1x tudo funciona que é uma blz,

exemplo: eu escolho a opção 2 ai ele abre a classe Cliente, eu consigo cadastrar o meu cliente, consigo busca-lo e etc... eu coloquei um opção q volta da classe Cliente para o Main, até ai ok, agora se vc tentar entrar novamente na classe Cliente simplesmente não vai, e se eu mudo o código para algo do tipo...

case 2:
                   Cliente c = new Cliente();
                   c.menuCliente();
                   break;

Simplesmente eu não consigo achar mais os meus clientes que eu cadastrei na primeira vez q eu rodei, e agora? :?:

*PS: É um trabalho simples de faculdade, n preciso de BD nem nda disso... eu só queria q enquanto o meu programa rodasse eles n perdesse os dados...

13 Respostas

Bruno_Ferreira1

Utiliza Do e While ao invés só de While

do{ //faz algo } While(opc!=6)

opção 6:

case 6: System.exit(o); break;

no switch você pode colocar um Default também:

Default: JOptionPane.showMessageDialog(null,"Digite as opções 1, 2 ,3 ou 6 para sair"); break;

H

Fala Bruno,

arrumei o programa que nem vc recomendou ficou mais clean, mas continua no mesmo problema =/

dpois q eu acesso a 1x o menu Clientes eu n consigo acessar novamente…

Bruno_Ferreira1

Hermes “Dada”:
Fala Bruno,

arrumei o programa que nem vc recomendou ficou mais clean, mas continua no mesmo problema =/

dpois q eu acesso a 1x o menu Clientes eu n consigo acessar novamente…

voce pode criar uma outra classe chamada Executor, coloque toda esta estrutura do/while dentro de um metodo desta classe
dentro deste método voce instancia os objetos das outras classes do mesmo modo
ja na classe Pc por exemplo, no metodo menuComputador(); ao digitar a opção correspondente a voltar ao outro menu, chame a função criada na classe Executor.

na classe PC voce pode criar um getPc() por exempo, pra retornar o Objeto com os atributos preenchidos,
ou getters dos atributos, para utilizar os mesmos atributos no objeto criado na classe Executor

não sei se isto é uma boa pratica de programação, devem existir maneiras mais “corretas”
existe um Design Pattern chamado Singleton também, não sei se é o seu caso
talvez os mais experientes ajudem

H

Fiz uns testes com uma outra classe e deu certo… então o problema não está no código do Main e sim no código do cliente?!

List<Cliente> listaCliente = new ArrayList<Cliente>(); // muito útil !

    void menuCliente(){ // ok
        Cliente c = new Cliente();
        while (escolha !=3){
           escolha = Integer.parseInt(JOptionPane.showInputDialog("Menu:"
               + "\n1- Cadastrar cliente"
               + "\n2- Buscar cliente"
               + "\n3- Sair"));
           switch (escolha){
               case 1:
                   c.cadastrando();
                   break;
               case 2:
                   c.buscaCliente();
                   break;
           }
        }
    }
H

Bruno Ferreira:
Hermes “Dada”:
Fala Bruno,

arrumei o programa que nem vc recomendou ficou mais clean, mas continua no mesmo problema =/

dpois q eu acesso a 1x o menu Clientes eu n consigo acessar novamente…

voce pode criar uma outra classe chamada Executor, coloque toda esta estrutura do/while dentro de um metodo desta classe
dentro deste método voce instancia os objetos das outras classes do mesmo modo
ja na classe Pc por exemplo, no metodo menuComputador(); ao digitar a opção correspondente a voltar ao outro menu, chame a função criada na classe Executor.

boa isso pode dar certo, vou testar aqui…

robertoMoraes

Olá poste o código do método menuCliente para que fique mais fácil entender o seu problema

Bruno_Ferreira1

atualizei minha resposta, da uma olhada pra ver se ajuda

H
List<Cliente> listaCliente = new ArrayList<Cliente>(); // muito útil !

    void menuCliente(){ // ok
        Cliente c = new Cliente();
        while (escolha !=3){
           escolha = Integer.parseInt(JOptionPane.showInputDialog("Menu:"
               + "\n1- Cadastrar cliente"
               + "\n2- Buscar cliente"
               + "\n3- Sair"));
           switch (escolha){
               case 1:
                   c.cadastraCliente();
                   break;
               case 2:
                   c.buscaCliente();
                   break;
           }
        }
    }

Pronto, segue o método menuCliente()

Bruno_Ferreira1
Hermes "Dada":
Fiz uns testes com uma outra classe e deu certo... então o problema não está no código do Main e sim no código do cliente?!
List<Cliente> listaCliente = new ArrayList<Cliente>(); // muito útil !

    void menuCliente(){ // ok
        Cliente c = new Cliente();
        while (escolha !=3){
           escolha = Integer.parseInt(JOptionPane.showInputDialog("Menu:"
               + "\n1- Cadastrar cliente"
               + "\n2- Buscar cliente"
               + "\n3- Sair"));
           switch (escolha){
               case 1:
                   c.cadastrando();
                   break;
               case 2:
                   c.buscaCliente();
                   break;
           }
        }
    }

neste menu falta o caso 3
se o cara digitar 3 acontece o que?
tem que chamar uma função, que faz aquilo que voce fez no main

H
Bruno Ferreira:
Hermes "Dada":
Fiz uns testes com uma outra classe e deu certo... então o problema não está no código do Main e sim no código do cliente?!
List<Cliente> listaCliente = new ArrayList<Cliente>(); // muito útil !

    void menuCliente(){ // ok
        Cliente c = new Cliente();
        while (escolha !=3){
           escolha = Integer.parseInt(JOptionPane.showInputDialog("Menu:"
               + "\n1- Cadastrar cliente"
               + "\n2- Buscar cliente"
               + "\n3- Sair"));
           switch (escolha){
               case 1:
                   c.cadastrando();
                   break;
               case 2:
                   c.buscaCliente();
                   break;
           }
        }
    }

neste menu falta o caso 3
se o cara digitar 3 acontece o que?
tem que chamar uma função, que faz aquilo que voce fez no main

Interessante, n sabia dessa função eu coloquei ela no método menuCliente() só o q acontece é q ele quita do programa e n volta pro menu do Main, vou tentar arrumar isso agora e acho q vai dar certo

haha acabei de descobrir q eu n sei fazer isso, como eu coloco um método q volte para o main? Eu coloquei uma nova opção no Switch q eh a Voltar e agora ?

robertoMoraes

Algo do tipo...

List<Cliente> listaCliente = new ArrayList<Cliente>(); // muito útil !

     void menuCliente(){ // ok

    int escolha = 0;
    while (escolha !=3){
       escolha = Integer.parseInt(JOptionPane.showInputDialog("Menu:"
           + "\n1- Cadastrar cliente"
           + "\n2- Buscar cliente"
           + "\n3- Sair"));
       switch (escolha){
           case 1:
               System.out.println("cadastrar Cliente");
               Cliente c = criarCliente();
               listaCliente.add(c);
               break;
           case 2:
               System.out.println("pesquizar Cliente");
               String clienteNome = "joao";
               pesquizaCliente(listaCliente, clienteNome);
               break;
       }
    }
 
    }
    
    public static void main(String[] args){
        Principal principal = new Principal();
        int escolha = 0;

        while (escolha !=6){
           escolha = Integer.parseInt(JOptionPane.showInputDialog("Menu:"
               + "\n1- Computador"
               + "\n2- Clientes"
               + "\n3- Promoções"
               + "\n6- Sair"));
           switch (escolha){
               case 1:
                   System.out.println("menuComputador");
                   break;
               case 2:
                   principal.menuCliente();
                   break;
               case 3:
                   System.out.println("menuPromoção");
                   break;
            }

        }
    }
Bruno_Ferreira1

Testei aqui criando uma nova classe chamada ExibeMenu, testa ai:

package guj;

import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class ExibeMenu {

    public Cliente cliente;
    List<Cliente> listaCliente ;

    public void menu(List list) {
        int opc = 0;

        cliente=new Cliente();

        //se a lista for nula, como na primeira vez que é chamada, ela é instanciada
        if(list==null)
            list=new ArrayList<Cliente>();

        //seta a lista do objeto instanciado aqui, para a que veio como parâmetro
        cliente.listaCliente = list;

        do{
           opc = Integer.parseInt(JOptionPane.showInputDialog("Menu:"
               + "\n1- Computador"
               + "\n2- Cliente"
               + "\n3- Sair"));
           switch(opc){
               case 1:

                   break;
               case 2:
                   cliente.menuCliente();
                   break;
               case 3:
                   JOptionPane.showMessageDialog(null,"Programa Fechado");
                   System.exit(3);

               default:
                   JOptionPane.showMessageDialog(null,"Insira apenas os numeros 1,2 ou 3");
                   break;
            }

        }while(opc!=3);
    }

}

mudei as outras duas classes tambem:

package guj;

import javax.swing.*;
import java.util.*;

public class Cliente {

    String cadastro_inicio;
    String nome;
    String endereco;
    String RG;
    String CPF;
    String telefone;
    String cadastro_final;
    int opc;
    //para o numero de cadastro não começar em zero, mudei pra 1
    int numCadastro = 1;

    List<Cliente> listaCliente = new ArrayList<Cliente>();

    void menuCliente(){ // menu da classe Cliente
       do{
           opc = Integer.parseInt(JOptionPane.showInputDialog("Menu:"
               + "\n1- Cadastrar cliente"
               + "\n2- Buscar cliente"
               + "\n3- Voltar")); 
           switch (opc){
               case 1:
                   this.cadastraCliente();
                   break;
               case 2:
                   this.buscaCliente();
                   break;
               case 3:
                   /*instancia exibemenu, para voltar ao menu principal
                    chamando a função menu daquela classe e mandando a
                    lista como parametro para objeto cliente instanciado
                    naquela classe*/

                   ExibeMenu e=new ExibeMenu();
                   e.menu(this.getLista());
                   break;

              default:
                  JOptionPane.showMessageDialog(null,"Insira apenas os numeros 1,2 ou 3");
                  break;
           }
        }while(opc != 3);
    }

    //metodo para retornar a lista
    private List getLista(){
        return listaCliente;
    }

     public void cadastraCliente(){ // Inicia o cadastro do Cliente
        Cliente cliente = new Cliente();

            cliente.nome = JOptionPane.showInputDialog("NOME:");
            cliente.endereco = JOptionPane.showInputDialog("ENDEREÇO", "Rua, 00");
            cliente.telefone = (JOptionPane.showInputDialog("TELEFONE:", "0000-0000"));
            cliente.RG = JOptionPane.showInputDialog("RG:", "00.000.000-0");
            cliente.CPF = JOptionPane.showInputDialog("CPF:", "[CPF removido]");

            cliente.cadastro_final = "\nNúmero de cadastro: "+numCadastro+"\nNome: "+cliente.nome+"\nEndereço: "+cliente.endereco+"\nTelefone: "+cliente.telefone+"\nRG: "+cliente.RG+"\nCPF: "+cliente.CPF;
            JOptionPane.showMessageDialog(null, "CADASTRO DO CLIENTE: "+cliente.cadastro_final);
            listaCliente.add(cliente);
            numCadastro += 1;
        }

    void buscaCliente(){ // Busca um cliente no cadastro pelo indice do List
            int num = Integer.parseInt(JOptionPane.showInputDialog("Insira o Número do cadastro"))-1;//coloquei -1 para mostrar o numero de cadastros começando por 1
             Cliente c=listaCliente.get(num);
            JOptionPane.showMessageDialog(null, "CADASTRO DO CLIENTE: "+c.cadastro_final);
       }

}
package guj;

public class Main {

    public static void main(String[] args) {
       //instanciando a classe exibemenu
        ExibeMenu e=new ExibeMenu();
       e.menu(null);
    }

}
H

Agradecer ao pessoal que me ajudou e especialmente ao Bruno

ficou show o programa agora está rodando do jeito que eu queria :twisted:

vou aproveitar como a entrega do trabalho é até o dia 11 e tentar mexer na perfumaria do projeto

vlw pessoal

abs

Criado 4 de abril de 2011
Ultima resposta 4 de abr. de 2011
Respostas 13
Participantes 3