Quem deve controlar é a Classe Menu, pois ela é a chamadora da consulta que é realizada através do método ler.
O resultado da consulta é retornado para a classe principal que informa o usuário e aguarda nova opção ou 4 para sair.
Entao eu poderia tirar esse try , o if deixar somente o while retornar estes dados e no menu eu deixo meu if para controlar os dados que serão mostrados?
O try … catch tem que ficar, pois está buscando dados de arquivo externo e o erro precisa ser capturado pela Exception.
O if pode migrar para o menu como um retorno do método.
Só para vc entender, o usuário indica 1, a classe principal pelo switch direciona para o case correto. As ações são realizadas pelos métodos da Classe Consulta e o resultado retorna para o menu com os dados a serem informados para o usuário ou registro não encontrado e volta para o menu para nova seleção do usuário.
Agora eu travei na hora de retorna esses dados e montar o if no menu, vou descansar um pouco e mais tarde eu tento denovo, no caso pra utilizar a classe que ta na package modelo, eu preciso fazer o import para meu menu ou basta somente fazer o import modelo.ConsultaChamados desta forma?
Pode importar desta forma e instanciar
ConsultaChamados consulta = new ConsultaChamados(); para que possa facilmente trazer os métodos quando apertar o sinal de ponto.
Por exemplo:
consulta., a IDE vai lhe sugerir os métodos disponíveis e daí seleciona
consulta.lerChamadosCSV(chamadoID, chamadoCSV);
Beleza eu tirei o if
public static void leChamadosCSV(String chamadoID, String chamadoCSV)
{
boolean ResultadoEncontrado = false;
String linha = "";
String delimitador = ";";
BufferedReader scan = null;
try
{
scan = new BufferedReader(new FileReader(chamadoCSV));
while((linha = scan.readLine()) != null)
{
String[] linhas = linha.split(delimitador);
}
}
catch(Exception E)
{
System.out.println("ERRO: " + E.getMessage());
}
}
Ai a classe lê e retorna os dados, porem quero guarda-los em arraylist eu posso fazer tipo, return []ListaChamados ? Aí lá no meu eu exibo o array e coloco o if, mas não to sabendo como construir
E como eu acesso os meus recursos dentro do packet recurso pra passa-los como parametros, tipo como fica o caminho dele dentro do meu projeto?
No seu método lerChamadosCSV este if dentro o while estava quase no caminho
O if que pode comentar é este aqui:
Bom, como vc já criou a entidade Chamados, precisa enviar os dados obtidos com a para os setters da sua classe Chamados.
Para isto, terá que modificar o seu método lerChamadosCSV para:
public List<Chamados> lerChamadosCSV(String chamadoID, String chamadoCSV) {
Depois, adiciona uma linha criando uma lista para os chamados.
List<Chamados> listaChamados = new ArrayList<>();
No seu while adicione o trecho abaixo e retorne a lista no final do seu método.
if (dados.length > 0) {
Chamados chamados = new Chamados();
chamados.setChamadoID(dados[0]);
chamados.setDescricao(dados[1]);
chamados.setDataAbertura(dados[2]);
chamados.setCusto(dados[3]);
listaChamados.add(chamados);
}
Poste o resultado para ver como ficou.
No menu, na opção 1 vc chama o método do pacote assim:
Fora do while e próximo do public static void main coloque esta linha:
ConsultaChamados consultaChamados = new ConsultaChamados();
Depois, dentro do case 1, chama o método do seu pacote (ajuste o que for necessário, faça os imports):
List<Chamados> listaChamados = new ArrayList<>();
listaChamados = consultaChamados.lerChamadosCSV(chamadoID, chamadosCSV);
consultaChamados.mostraChamados(chamadoID, listaChamados);
No seu modelo ConsultaChamados comente o seu método de mostrarChamados e coloque este aqui:
public void mostraChamados(String chamadoID, List listaChamados) {
for (int i = 0; i < listaChamados.size(); i++) {
Chamados chamados = (Chamados) listaChamados.get(i);
if (chamados.getChamadoID().equals(chamadoID)) {
System.out.println("\nID: " + chamados.getChamadoID() + "\n" + "Descricao: " + chamados.getDescricao() + "\n"
+ "Data de abertura: " + chamados.getDataAbertura() + "\n" + "Custo: " + chamados.getCusto());
}
}
}
Ai no case1 eu posso já começar a pegar o id que o usuário irá digitar e o caminho de chamados CSV certo?
package visao;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;import entidade.Chamados;
import modelo.ConsultaChamados;public class Menu {
public static void main(String[] args) {
ConsultaChamados consultaChamados = new ConsultaChamados(); Scanner scan = new Scanner(System.in); System.out.println("------------------------------------------------"); System.out.println(" Bemvindo ao sistema de consulta de chamados "); System.out.println("------------------------------------------------\n"); System.out.println("Selecione uma opção para continuar: \n"); System.out.println("Digite 1 para consultar "); System.out.println("Digite 2 para salvar "); System.out.println("Digite 3 para carregar "); System.out.println("Digite 4 para sair \n"); int opcao = scan.nextInt(); boolean opcaoValida = true; while(opcao == 0 || opcao > 4) { System.out.println("Digite uma opção válida ! \n"); opcao = scan.nextInt(); } if(opcao > 0 || opcao <= 4) { switch(opcao){ //Caso 1 - Chama função que recupera os dados do arquivo CSV case 1: { List<Chamados> listaChamados = new ArrayList<>(); listaChamados = consultaChamados.leChamadosCSV(chamadoID, chamadosCSV); consultaChamados.mostraChamados(chamadoID, listaChamados); break; } case 2:{ System.out.println("Opcao 2 selecionada"); break; } case 3:{ System.out.println("Opcao 3 selecionada"); break; } case 4:{ System.out.println("Obrigado por utilizar minha aplicação, saindo... \n"); opcaoValida = false; } default:{ System.out.println("Erro desconhecido \n"); opcaoValida = false; } } }
}
}
Classe Consulta:
Agora ele me diz que preciso criar os metodos getters e setters mas nao sei com o que devo popula-los, no caso seria com um scan para capturar o que o usuario digitar ou eu faço isso no menu?
package modelo;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.List;import entidade.Chamados;
public class ConsultaChamados
{
public void mostraChamados(String chamadoID, List listaChamados)
{
for (int i = 0; i < listaChamados.size(); i++)
{
Chamados chamados = (Chamados) listaChamados.get(i);if (chamados.getChamadoID().equals(chamadoID)) { System.out.println( "\nID: " + chamados.getChamadoID() + "\n" + "Descricao: " + chamados.getDescricao() + "\n" + "Data de abertura: " + chamados.getDataAbertura() + "\n" + "Custo: " + chamados.getCusto() ); } } }
public static void leChamadosCSV(String chamadoID, String chamadoCSV)
{ boolean ResultadoEncontrado = false; String linha = ""; String delimitador = ";"; BufferedReader scan = null; try { scan = new BufferedReader(new FileReader(chamadoCSV)); while((linha = scan.readLine()) != null) { String[] linhas = linha.split(delimitador); } } catch(Exception E) { System.out.println("ERRO: " + E.getMessage()); } }
}
Isto mesmo.
Devolve para o case1 o seu código que vc removeu.
System.out.println("Opcao 1 selecionada");
System.out.println("Por favor, informe o ID do chamado: ");
//Pega o ID em forma de INT e transforma em String
String chamadoID = Integer.toString(scan.nextInt());
Vai popular os setters conforme lhe expliquei na resposta 28.
Agora eu me confundi todo com o código, minha classe está assim:
package modelo;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.List;import entidade.Chamados;
public class ConsultaChamados
{
public void mostraChamados(String chamadoID, List listaChamados)
{
for (int i = 0; i < listaChamados.size(); i++)
{
Chamados chamados = (Chamados) listaChamados.get(i);if (chamados.getChamadoID().equals(chamadoID)) { System.out.println( "\nID: " + chamados.getChamadoID() + "\n" + "Descricao: " + chamados.getDescricao() + "\n" + "Data de abertura: " + chamados.getDataAbertura() + "\n" + "Custo: " + chamados.getCusto() ); } } }
public List lerChamadosCSV(String chamadoID, String chamadoCSV)
{ boolean ResultadoEncontrado = false; String dados = ""; String delimitador = ";"; BufferedReader scan = null; try { scan = new BufferedReader(new FileReader(chamadoCSV)); while((dados = scan.readLine()) != null) { if (dados.length > 0) { Chamados chamados = new Chamados(); chamados.setChamadoID(dados); chamados.setDescricao(dados); chamados.setDataAbertura(dados); chamados.setCusto(dados); listaChamados.add(chamados); } } } catch(Exception E) { System.out.println("ERRO: " + E.getMessage()); } }
}
Antes deste código coloca a linha do List
List<Chamados> listaChamados = new ArrayList<>();
Antes da última } coloque
return listaChamados;
Depois executa o menu para ver o resultado .
Estou com estes problemas aqui , por conta da falta desses getters e setters que não entendi como fazer.
Precisa criar os getters e setters na classe Chamados.
No Eclipse, estando na classe Chamados segue este exemplo.
https://www.mkyong.com/eclipse/generate-getters-and-setters-in-eclipse-ide/
Faltou fazer aquilo que lhe falei na resposta 30.
Recoloque o seu código acima na classe Menu para localizar o arquivo CSV.
Agora o menu está legível para mim segue o código:
package visao;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;import entidade.Chamados;
import modelo.ConsultaChamados;public class Menu {
public static void main(String[] args) {
ConsultaChamados consultaChamados = new ConsultaChamados(); String chamadosCSV = "recursos/Chamados.csv"; Scanner scan = new Scanner(System.in); System.out.println("------------------------------------------------"); System.out.println(" Bemvindo ao sistema de consulta de chamados "); System.out.println("------------------------------------------------\n"); System.out.println("Selecione uma opção para continuar: \n"); System.out.println("Digite 1 para consultar "); System.out.println("Digite 2 para salvar "); System.out.println("Digite 3 para carregar "); System.out.println("Digite 4 para sair \n"); int opcao = scan.nextInt(); boolean opcaoValida = true; while(opcao == 0 || opcao > 4) { System.out.println("Digite uma opção válida ! \n"); opcao = scan.nextInt(); } if(opcao > 0 || opcao <= 4) { switch(opcao){ //Caso 1 - Chama função que recupera os dados do arquivo CSV case 1: { //Pede ao usuário para informar o ID do chamado System.out.println("Por favor, informe o ID do chamado: "); //A variavel aqui chama scan2 pois já existe outra variável com o nome scan Scanner scan2 = new Scanner(System.in); //Pegamos o ID em forma de INT e transformamos em String String chamadoID = Integer.toString(scan2.nextInt()); //Criamos nosso ArrayList List<Chamados> listaChamados = new ArrayList<>(); //Recebemos o resultado da classe e o armazenamos na ArrayList listaChamados = consultaChamados.lerChamadosCSV(chamadoID, chamadosCSV); consultaChamados.mostraChamados(chamadoID, listaChamados); break; } case 2:{ System.out.println("Opcao 2 selecionada"); break; } case 3:{ System.out.println("Opcao 3 selecionada"); break; } case 4:{ System.out.println("Obrigado por utilizar minha aplicação, saindo... \n"); opcaoValida = false; } default:{ System.out.println("Erro desconhecido \n"); opcaoValida = false; } } }
}
}
A minha classe está assim:
package modelo;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;import entidade.Chamados;
public class ConsultaChamados
{
public List lerChamadosCSV(String chamadoID, String chamadoCSV){ boolean ResultadoEncontrado = false; List<Chamados> listaChamados = new ArrayList<>(); String dados = ""; String delimitador = ";"; BufferedReader scan = null; try { scan = new BufferedReader(new FileReader(chamadoCSV)); while((dados = scan.readLine()) != null) { if (dados.length > 0) { Chamados chamados = new Chamados(); chamados.setChamadoID(dados); chamados.setDescricao(dados); chamados.setDataAbertura(dados); chamados.setCusto(dados); listaChamados.add(chamados); } } } catch(Exception E) { System.out.println("ERRO: " + E.getMessage()); } return listaChamados; }
public void mostraChamados(String chamadoID, List listaChamados)
{
for (int i = 0; i < listaChamados.size(); i++)
{
Chamados chamados = (Chamados) listaChamados.get(i);if (chamados.getChamadoID().equals(chamadoID)) { System.out.println( "\nID: " + chamados.getChamadoID() + "\n" + "Descricao: " + chamados.getDescricao() + "\n" + "Data de abertura: " + chamados.getDataAbertura() + "\n" + "Custo: " + chamados.getCusto() ); } } }
}
E os getters e setters da Classe Chamado estão aqui:
package entidade;
public class Chamados {
private String dados;
public void setChamadoID(String dados) {
this.dados = dados;
}public Object getChamadoID() {
return getChamadoID();
}public String getDescricao() {
return getDescricao();
}public String getDataAbertura() {
return getDataAbertura();
}public String getCusto() {
return getCusto();
}public void setDescricao(String dados) {
this.dados = dados;
}public void setDataAbertura(String dados) {
this.dados = dados;
}public void setCusto(String dados) {
this.dados = dados;
}}
Rodei o código e o resultado foi:
Bemvindo ao sistema de consulta de chamados
Selecione uma opção para continuar:
Digite 1 para consultar
Digite 2 para salvar
Digite 3 para carregar
Digite 4 para sair1
Por favor, informe o ID do chamado:
76729
ERRO: recursos\Chamados.csv (O sistema não pode encontrar o caminho especificado)
Tentei mudar o caminho que está recursos/Chamados.csv para Chamados.csv mas não adiantou, ai fica minha dúvida, posso navegar por eles assim como por exemplo chamo um script em uma página web ?
Copie os arquivo CSV para a raiz do seu projeto e rode novamente.
Estranho, mesmo aqui ele não encontra o arquivo.
Mas alterou a string para ficar como “Chamados.csv”?