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

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 :?

[code]
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;               
        }

    }
}

}[/code]

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…

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;

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…

[quote=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…

[/quote]

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

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;
           }
        }
    }

[quote=Bruno Ferreira][quote=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…

[/quote]

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.

[/quote]

boa isso pode dar certo, vou testar aqui…

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

atualizei minha resposta, da uma olhada pra ver se ajuda

    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()

[quote=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?!

[code]
List listaCliente = new ArrayList(); // 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;
       }
    }
}

[/code][/quote]

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

[quote=Bruno Ferreira][quote=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?!

[code]
List listaCliente = new ArrayList(); // 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;
       }
    }
}

[/code][/quote]

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[/quote]

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 ?

Algo do tipo…

[code]
List listaCliente = new ArrayList(); // 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;
        }

    }
}[/code]

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

[code]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);
}

}
[/code]

mudei as outras duas classes tambem:

[code]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:", "000.000.000-00");

        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);
   }

}
[/code]

[code]package guj;

public class Main {

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

}[/code]

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