Pessoal td bem, bem eu gostaria de saber que passos devo dar para ler dados de um ficheiro eu pretendo usar a classe FileReader, so que não sei como começar a ler dados do ficheiro, não quero codigo feito, apenas uma explicação.
Como ler dados de um ficheiro
20 Respostas
A partir do Java 5, é melhor realizar a leitura de arquivos com a classe Scanner…
Scanner sc = new Scanner(new File("CAMINHO"));
utilize o método hasnext pra saber se ainda há entradas e nextLine para ler linha por linha.
Se vc realmente quer usar FileReader… vc terá de criar e instanciar um objeto de tipo BufferedReader, que recebe como parâmetro um FileReader que, por sua vez, recebe o caminho do arquivo no seu construtor… veja
BufferedReader bf = new BufferedReader(new FileReader("CAMINHO"));
Utilize o método readLine para ler linha por linha… esse método retornará null ao final do arquivo…
Não se esqueça de sempre fechar o arquivo após a leitura… ok?
Refereste a que entradas?
Sobre o Scanner eu sei que ele pode ser usado para dar entrada de dados, mas para o caso de ficheiro ele é usado com que finalidade?
E se eu usar o bufferedreader tenho que usar o scanner?
public void lerArquivo()
{
try
{
String linha = null;
FileReader fr = new FileReader("Dados.txt");
BufferedReader br = new BufferedReader(fr);
while((linha=br.readLine()) != null)
{
System.out.println(linha); //imprime na tela o que está sendo lendo
}
}
catch(IOException exc)
{
System.out.println("Não foi possível ler seu arquivo");
}
}
while((linha=br.readLine()) != null)
Não compreendi esta linha, e por outro lado testei o teu codigo e ele so executa o que está dentro do catch.
while((linha=br.readLine()) != null)
// enquanto a linha lida for diferente de null
// isso vai fazer com que leia linha por linha
// e parar depois de ler a ultima linha,
// pois "linha" vai ser igual a null
o catch está sendo executado pois certamente não está sendo localizado o seu arquivo,
para ele poder ler, primeiro ele deve ser criado
Cara era mesmo esse o erro.
Agora acontece o seguinte, eu estou a tentar fazer o automatismo de um codigo, o que eu pretendo fazer é q o nr de vezes que contar as linhas eu vou incrementando uma variavel, assim eu vou obter semrpre o ultimo codigo e dai incremento mais um, eis o codigo:
public cadastrarcliente(int j)
{
super("..:BPC:..Cadastrar Cliente");
constrform(j);
setVisible(true);
setSize(250,250);
setResizable(false);
setLocationRelativeTo(null);
pack();
}
public int codigoutomatico()
{
try
{
int i=0;
String linha = null;
FileReader fr = new FileReader("clientes.txt");
BufferedReader br = new BufferedReader(fr);
while((linha=br.readLine()) != null)
{
return i++;
}
br.close();
}
catch(IOException exc)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
}Apresenta erro aqui.
public void constrform(int h)
{
painellabeltext = new JPanel();
painellabeltext.setLayout(new GridLayout(6,2));
lblcodcliente = new JLabel("Codigo do Cliente", lblcodcliente.RIGHT);
lblnome = new JLabel("Nome", lblnome.RIGHT);
lblbairro = new JLabel("Bairro", lblbairro.RIGHT);
lbllocalidade = new JLabel("Localidade", lbllocalidade.RIGHT);
lbldata = new JLabel("Data", lbldata.RIGHT );
lblvalor = new JLabel("Valor", lblvalor.RIGHT);
txtcodcliente = new JTextField();
txtcodcliente.setText((h+1)+"");
//txtcodcliente.getText();
txtnome = new JTextField();
//txtnome.geText();
//if (txtnome.getString().trim().length())
//JOptionPane.showMessageDialog(null,"Por favor informe o seu nome");
txtbairro = new JTextField();
//txtbairro.geText();
localidade = new JComboBox(localidades);
//localidade.geText();
txtdata = new JTextField(criaData());//Adiciona data a JTextField
txtdata.setEnabled(false);
//txtdata.geText();
txtvalor = new JTextField();
//txtvalor.setSize(8,8);
txtvalor.setDocument(new validacarecteres());
//txtvalor.geText();
cadastrar = new JButton("Cadastrar");
cadastrar.addActionListener(this);
cancelar = new JButton("Cancelar");
cancelar.addActionListener(this);
painellabeltext.add(lblcodcliente);
painellabeltext.add(txtcodcliente);
painellabeltext.add(lblnome);
painellabeltext.add(txtnome);
painellabeltext.add(lblbairro);
painellabeltext.add(txtbairro);
painellabeltext.add(lbllocalidade);
painellabeltext.add(localidade);
painellabeltext.add(lbldata);
painellabeltext.add(txtdata);
painellabeltext.add(lblvalor);
painellabeltext.add(txtvalor);
painelbotoes = new JPanel();
painelbotoes.add(cadastrar);
painelbotoes.add(cancelar);
getContentPane().add(painellabeltext,BorderLayout.CENTER);
getContentPane().add(painelbotoes, BorderLayout.SOUTH);
}
public static void main(String args[])
{
int v;
v = 0;
new cadastrarcliente(v);
}
O que acontence é que ele apresenta erro na ultima chaveta do metodo codigoautomatico, alguem sabe o pq deste erro.
Bem pessoal fiz uma pequena alteração no metodo codigoautomatico e ficou assim:
public int codigoutomatico()
{
int codigo = 0;
try
{
String linha = null;
FileReader fr = new FileReader("clientes.txt");
BufferedReader br = new BufferedReader(fr);
while((linha=br.readLine()) != null)
codigo++;
br.close();
}
catch(IOException exc)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
return codigo;
}
O que acontece é que ele esta sempre a retornar zero, ou seja ele não entra no bloco try.
//Fiz um teste aqui, compilei o seu código e ele me retornou a quantidade de linhas que foi lida;
//seu arquivo "clientes.txt" tem alguma coisa gravado dentro dele?? ele retorna ZERO '0', caso não tenha nenhum dado gravado nele;
// Outra coisa, voce não chamou em nenhum momento seu método dentro do seu código,
// pode fazer assim no seu código:
int a = codigoAutomatico();
//'a' vai receber o retorno do método codigoAutomático()
public int codigoAutomatico() //observar que esqueceu do "A", mas isso é detalhe =D, tava codigoUtomatico()
{
int codigo = 0;
try
{
String linha = null;
FileReader fr = new FileReader("clientes.txt");
BufferedReader br = new BufferedReader(fr);
while((linha=br.readLine()) != null)
{
codigo++;
}
br.close();
}
catch(IOException exc)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
return codigo;
}
Cara, mais aonde passo é “a”, como uso ele?
bom, no seu código, voce apenas criou o método “codigoAutomatico()”, mas não utilizou ele,
int variavelDeRetornoDoMetodo = codigoAutomatico();
a “variavelDeRetornoDoMetodo” vai receber o valor de linhas contadas,
utilizando o seu método criado o “return codigo” é quem vai retornar este valor
Cara, usei o q tu me dizeste e está a acontecer o msmo, eis o codigo:
int a = codigoautomatico();
public cadastrarcliente(int j)
{
super("..:BPC:..Cadastrar Cliente");
constrform(j);
setVisible(true);
setSize(250,250);
setResizable(false);
setLocationRelativeTo(null);
pack();
}
public int codigoautomatico()
{
int codigo = 0;
try
{
String linha = null;
FileReader fr = new FileReader("clientes.txt");
BufferedReader br = new BufferedReader(fr);
while((linha=br.readLine()) != null)
codigo++;
br.close();
}
catch(IOException exc)
{
//JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
System.out.println(exc.getMessage());
}
return codigo;
}
public void constrform(int h)
{
painellabeltext = new JPanel();
painellabeltext.setLayout(new GridLayout(6,2));
lblcodcliente = new JLabel("Codigo do Cliente", lblcodcliente.RIGHT);
lblnome = new JLabel("Nome", lblnome.RIGHT);
lblbairro = new JLabel("Bairro", lblbairro.RIGHT);
lbllocalidade = new JLabel("Localidade", lbllocalidade.RIGHT);
lbldata = new JLabel("Data", lbldata.RIGHT );
lblvalor = new JLabel("Valor", lblvalor.RIGHT);
txtcodcliente = new JTextField();
txtcodcliente.setText((h+1)+"");
//txtcodcliente.getText();
txtnome = new JTextField();
//txtnome.geText();
//if (txtnome.getString().trim().length())
//JOptionPane.showMessageDialog(null,"Por favor informe o seu nome");
txtbairro = new JTextField();
//txtbairro.geText();
localidade = new JComboBox(localidades);
//localidade.geText();
txtdata = new JTextField(criaData());//Adiciona data a JTextField
txtdata.setEnabled(false);
//txtdata.geText();
txtvalor = new JTextField();
//txtvalor.setSize(8,8);
txtvalor.setDocument(new validacarecteres());
//txtvalor.geText();
cadastrar = new JButton("Cadastrar");
cadastrar.addActionListener(this);
cancelar = new JButton("Cancelar");
cancelar.addActionListener(this);
painellabeltext.add(lblcodcliente);
painellabeltext.add(txtcodcliente);
painellabeltext.add(lblnome);
painellabeltext.add(txtnome);
painellabeltext.add(lblbairro);
painellabeltext.add(txtbairro);
painellabeltext.add(lbllocalidade);
painellabeltext.add(localidade);
painellabeltext.add(lbldata);
painellabeltext.add(txtdata);
painellabeltext.add(lblvalor);
painellabeltext.add(txtvalor);
painelbotoes = new JPanel();
painelbotoes.add(cadastrar);
painelbotoes.add(cancelar);
getContentPane().add(painellabeltext,BorderLayout.CENTER);
getContentPane().add(painelbotoes, BorderLayout.SOUTH);
}
public static void main(String args[])
{
int v = 0;
new cadastrarcliente(v);
}
}
//voce deve chamar o método CodigoAutomatico() dentro de outro método
public cadastrarcliente(int j)
{
super("..:BPC:..Cadastrar Cliente");
constrform(j);
setVisible(true);
setSize(250,250);
setResizable(false);
setLocationRelativeTo(null);
JOptionPane.showMessageDialog(null, "Número de Linhas Dentro do Arquivo é: "+codigoAutomatico());
//retorna o valor do método em uma JOptionPane
//lembrando que se o arquivo estiver VAZIO vai retornar "ZERO"
pack();
}
Cara funcionou, eis o codigo:
public cadastrarcliente(int j)
{
super("..:BPC:..Cadastrar Cliente");
constrform(j);
setVisible(true);
setSize(250,250);
setResizable(false);
setLocationRelativeTo(null);
pack();
}
public int codigoautomatico()
{
int codigo = 1;
try
{
String linha = null;
FileReader fr = new FileReader("clientes.txt");
BufferedReader br = new BufferedReader(fr);
while((linha=br.readLine()) != null)
codigo++;
br.close();
}
catch(IOException exc)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
return codigo;
}
public void constrform(int h)
{
painellabeltext = new JPanel();
painellabeltext.setLayout(new GridLayout(6,2));
lblcodcliente = new JLabel("Codigo do Cliente", lblcodcliente.RIGHT);
lblnome = new JLabel("Nome", lblnome.RIGHT);
lblbairro = new JLabel("Bairro", lblbairro.RIGHT);
lbllocalidade = new JLabel("Localidade", lbllocalidade.RIGHT);
lbldata = new JLabel("Data", lbldata.RIGHT );
lblvalor = new JLabel("Valor", lblvalor.RIGHT);
txtcodcliente = new JTextField();
txtcodcliente.setText((a+1)+"");
txtcodcliente.setEnabled(false);
//txtcodcliente.getText();
txtnome = new JTextField();
//txtnome.geText();
//if (txtnome.getString().trim().length())
//JOptionPane.showMessageDialog(null,"Por favor informe o seu nome");
txtbairro = new JTextField();
//txtbairro.geText();
localidade = new JComboBox(localidades);
//localidade.geText();
txtdata = new JTextField(criaData());//Adiciona data a JTextField
txtdata.setEnabled(false);
//txtdata.geText();
txtvalor = new JTextField();
//txtvalor.setSize(8,8);
txtvalor.setDocument(new validacarecteres());
//txtvalor.geText();
cadastrar = new JButton("Cadastrar");
cadastrar.addActionListener(this);
cancelar = new JButton("Cancelar");
cancelar.addActionListener(this);
painellabeltext.add(lblcodcliente);
painellabeltext.add(txtcodcliente);
painellabeltext.add(lblnome);
painellabeltext.add(txtnome);
painellabeltext.add(lblbairro);
painellabeltext.add(txtbairro);
painellabeltext.add(lbllocalidade);
painellabeltext.add(localidade);
painellabeltext.add(lbldata);
painellabeltext.add(txtdata);
painellabeltext.add(lblvalor);
painellabeltext.add(txtvalor);
painelbotoes = new JPanel();
painelbotoes.add(cadastrar);
painelbotoes.add(cancelar);
getContentPane().add(painellabeltext,BorderLayout.CENTER);
getContentPane().add(painelbotoes, BorderLayout.SOUTH);
}
Mas agora acontence o seguinte, depois de eu inserir os dados no ficheiro, e ele mandar a mensagem a dizer que os dados foram gravados com sucesso, o codigo continua a ser o msmo, ou seja ele so altera caso eu fechar a frame, mas eu gostaria que ele altera-se o codigo assim que eu pressiona-se no botão da mensagem.
como você está gravando seus dados no ficheiro?
Inicialmente eu mando os dados inseridos pelo usuario numa classe objcliente de seguida ele vai a uma outra classe aonde encontram-se as operações necessarias para adicionar os dados ao ficheiro
classe cadastrarcliente.java
public void actionPerformed(ActionEvent event)
{
if(event.getSource()==cadastrar)
{
objcliente cliente = new objcliente();//Instanciamento do JAVABEAN
if(txtnome.getText().trim().equals(""))
{
JOptionPane.showMessageDialog(null,"Por favor informe o nome do(a) cliente","BPC",JOptionPane.INFORMATION_MESSAGE);
txtnome.grabFocus();
}
else
if(txtbairro.getText().trim().equals(""))
{
JOptionPane.showMessageDialog(null,"Por favor informe o o bairro do(a) cliente","BPC",JOptionPane.INFORMATION_MESSAGE);
txtbairro.grabFocus();
}
else
if(txtvalor.getText().trim().equals(""))
{
JOptionPane.showMessageDialog(null,"Por favor informe o valor","BPC",JOptionPane.INFORMATION_MESSAGE);
txtvalor.grabFocus();
}
else
{
cliente.setcodigo(Integer.parseInt(txtcodcliente.getText()));
cliente.setnome(txtnome.getText());
cliente.setbairro(txtbairro.getText());
cliente.setlocalidade((String) localidade.getSelectedItem());//Casting de localidade
cliente.setdata(txtdata.getText());
cliente.setvalor(Double.parseDouble(txtvalor.getText()));
new operacoes().adiciona(cliente);//Instancia a classe operações e nessa referencia vai chamar o metodo adiciona
//dispose();
//txtcodcliente.setText((a+1)+"");
txtnome.setText("");
txtbairro.setText("");
txtvalor.setText("");
}
}
else
if(event.getSource()==cancelar)
{
dispose();
}
}
Classe objcliente.java
import java.util.*;
class objcliente
{
private int codigo;
private String nome;
private String bairro;
private String localidade;
private String data;
private double valor;
public int getcodigo()
{
return codigo;
}
public void setcodigo(int codigo)
{
this.codigo = codigo;
}
public String getnome()
{
return nome;
}
public void setnome(String nome)
{
this.nome = nome;
}
public String getbairro()
{
return bairro;
}
public void setbairro(String bairro)
{
this.bairro = bairro;
}
public String getlocalidade()
{
return localidade;
}
public void setlocalidade(String localidade)
{
this.localidade = localidade;
}
public String getdata()
{
Calendar data = Calendar.getInstance();
return data.get(5) + "/" + data.get(2) + "/" + data.get(1);
}
public void setdata(String data)
{
this.data = data;
}
public double getvalor()
{
return valor;
}
public void setvalor(double valor)
{
this.valor = valor;
}
}
Classe operacoes.java
import java.io.*;
import javax.swing.JOptionPane;
public class operacoes
{
private String ficheiro = "clientes.txt";
FileWriter fichcliente = new FileWriter(ficheiro,true);
public void adiciona(objcliente adicionar)
{
try
{
fichcliente.write(adicionar.getcodigo()+"");
fichcliente.write("|");
fichcliente.write(adicionar.getnome());
fichcliente.write("|");
fichcliente.write(adicionar.getbairro());
fichcliente.write("|");
fichcliente.write(adicionar.getlocalidade());
fichcliente.write("|");
fichcliente.write(adicionar.getdata());
fichcliente.write("|");
fichcliente.write(adicionar.getvalor()+"");
fichcliente.write("\r\n");
JOptionPane.showMessageDialog(null,"O cliente " + adicionar.getnome() + " foi com sucesso","BPC",JOptionPane.INFORMATION_MESSAGE);
//System.out.println(fichcliente.read());
fichcliente.close();
}
catch (IOException e)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
}
}
as sua Classe Principal, onde monta a interface gráfica, defina isso junto com as outras variaveis:
public static int codigoAtual=0;
//esta vai ser a variavel que terá sempre a quantidade de clientes cadastrados
Fiz uma modificação na sua classe operações
package controleestoquemedalhas;
import java.io.*;
import javax.swing.JOptionPane;
public class operacoes
{
private String ficheiro = "clientes.txt";
FileWriter fichcliente = null;
public void adiciona(objectcliente adicionar)
{
try
{
fichcliente = new FileWriter(ficheiro,true);
//Cria o FileWriter dentro do Try, pois pode ocorrer Exception
fichcliente.write(adicionar.getcodigo()+"");
fichcliente.write("|");
fichcliente.write(adicionar.getnome());
fichcliente.write("|");
fichcliente.write(adicionar.getbairro());
fichcliente.write("|");
fichcliente.write(adicionar.getlocalidade());
fichcliente.write("|");
fichcliente.write(adicionar.getdata());
fichcliente.write("|");
fichcliente.write(adicionar.getvalor()+"");
fichcliente.write("\r\n");
fichcliente.close();
JOptionPane.showMessageDialog(null,"O cliente " + adicionar.getnome() + " foi adicionado com sucesso","BPC",JOptionPane.INFORMATION_MESSAGE);
//Sempre que voce gravar um dado no ficheiro, o metodo codigo automatico vai entrar no seu arquivo
//e retornar a quantidade de linhas contadas
SuaClassePrincipal.codigoAtual = SuaClassePrincipal().codigoautomatico();
//assim voce não precisara fechar e abrir novamente o seu projeto para contar as linhas
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null,"Erro ao gravar no ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
}
}
Cara não está a funcionar, fiz o seguinte:
Classe operacoes.java
public void adiciona(objcliente adicionar)
{
try
{
fichcliente = new FileWriter(ficheiro,true);
fichcliente.write(adicionar.getcodigo()+"");
fichcliente.write("|");
fichcliente.write(adicionar.getnome());
fichcliente.write("|");
fichcliente.write(adicionar.getbairro());
fichcliente.write("|");
fichcliente.write(adicionar.getlocalidade());
fichcliente.write("|");
fichcliente.write(adicionar.getdata());
fichcliente.write("|");
fichcliente.write(adicionar.getvalor()+"");
fichcliente.write("\r\n");
JOptionPane.showMessageDialog(null,"O cliente " + adicionar.getnome() + " foi com sucesso","BPC",JOptionPane.INFORMATION_MESSAGE);
constrform.codigoAtual = constrform().codigoautomatico();
//System.out.println(fichcliente.read());
fichcliente.close();
}
catch (IOException e)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
}
Classe cadastrarcliente.java
public class cadastrarcliente extends JFrame implements ActionListener
{
private JLabel lblcodcliente, lblnome, lblbairro,lbllocalidade, lbldata, lblvalor;
private JTextField txtcodcliente, txtnome, txtbairro, txtdata, txtvalor;
String[] localidades ={"Bengo","Benguela","Bié","Cabinda","Cuando-Cubango","Cunene","Kwanza-Norte","Kwanza-Sul","Huambo","Huíla","Luanda","Lunda-Norte","Lunda-Sul","Malanje","Moxico","Namibe","Uíge","Zaire"};
private JComboBox localidade;
private JPanel formcliente,painelbotoes,painellabeltext;
private JButton cadastrar, cancelar;
public static int codigoAtual=0;
int a = codigoautomatico();
public cadastrarcliente(int j)
{
super("..:BPC:..Cadastrar Cliente");
constrform(j);
setVisible(true);
setSize(250,250);
setResizable(false);
setLocationRelativeTo(null);
pack();
}
public int codigoautomatico()
{
int codigo = 1;
try
{
String linha = null;
FileReader fr = new FileReader("clientes.txt");
BufferedReader br = new BufferedReader(fr);
while((linha=br.readLine()) != null)
codigo++;
br.close();
}
catch(IOException exc)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
return codigo;
}
public void constrform(int h)
{
painellabeltext = new JPanel();
painellabeltext.setLayout(new GridLayout(6,2));
lblcodcliente = new JLabel("Codigo do Cliente", lblcodcliente.RIGHT);
lblnome = new JLabel("Nome", lblnome.RIGHT);
lblbairro = new JLabel("Bairro", lblbairro.RIGHT);
lbllocalidade = new JLabel("Localidade", lbllocalidade.RIGHT);
lbldata = new JLabel("Data", lbldata.RIGHT );
lblvalor = new JLabel("Valor", lblvalor.RIGHT);
txtcodcliente = new JTextField();
txtcodcliente.setText((a+1)+"");
txtcodcliente.setEnabled(false);
//txtcodcliente.getText();
txtnome = new JTextField();
//txtnome.geText();
//if (txtnome.getString().trim().length())
//JOptionPane.showMessageDialog(null,"Por favor informe o seu nome");
txtbairro = new JTextField();
//txtbairro.geText();
localidade = new JComboBox(localidades);
//localidade.geText();
txtdata = new JTextField(criaData());//Adiciona data a JTextField
txtdata.setEnabled(false);
//txtdata.geText();
txtvalor = new JTextField();
//txtvalor.setSize(8,8);
txtvalor.setDocument(new validacarecteres());
//txtvalor.geText();
cadastrar = new JButton("Cadastrar");
cadastrar.addActionListener(this);
cancelar = new JButton("Cancelar");
cancelar.addActionListener(this);
painellabeltext.add(lblcodcliente);
painellabeltext.add(txtcodcliente);
painellabeltext.add(lblnome);
painellabeltext.add(txtnome);
painellabeltext.add(lblbairro);
painellabeltext.add(txtbairro);
painellabeltext.add(lbllocalidade);
painellabeltext.add(localidade);
painellabeltext.add(lbldata);
painellabeltext.add(txtdata);
painellabeltext.add(lblvalor);
painellabeltext.add(txtvalor);
painelbotoes = new JPanel();
painelbotoes.add(cadastrar);
painelbotoes.add(cancelar);
getContentPane().add(painellabeltext,BorderLayout.CENTER);
getContentPane().add(painelbotoes, BorderLayout.SOUTH);
}
cara, faz o seguinte, me manda todo o seu código por MP
pra mim ter uma noção do que estás a fazer
faça as seguintes modificações:
public static int codigoAtual=0;
//int a = codigoautomatico();//essa não vai precisar mais, pois vamos utilizar a esta de cima "codigoAtual"
public cadastrarcliente(int j)
{
super("..:BPC:..Cadastrar Cliente");
codigoAtual=codigoAutomatico(); //coloque a inicialização aqui
constrform(j);
setVisible(true);
setSize(250,250);
setResizable(false);
setLocationRelativeTo(null);
pack();
}
e Esta outra modificação no adiciona
public void adiciona(objcliente adicionar)
{
try
{
fichcliente = new FileWriter(ficheiro,true);
fichcliente.write(adicionar.getcodigo()+"");
fichcliente.write("|");
fichcliente.write(adicionar.getnome());
fichcliente.write("|");
fichcliente.write(adicionar.getbairro());
fichcliente.write("|");
fichcliente.write(adicionar.getlocalidade());
fichcliente.write("|");
fichcliente.write(adicionar.getdata());
fichcliente.write("|");
fichcliente.write(adicionar.getvalor()+"");
fichcliente.write("\r\n");
JOptionPane.showMessageDialog(null,"O cliente " + adicionar.getnome() + " foi com sucesso","BPC",JOptionPane.INFORMATION_MESSAGE);
//constrform.codigoAtual = constrform().codigoautomatico();
cadastrarcliente.codigoAtual = cadastrarcliente().codigoautomatico();
//System.out.println(fichcliente.read());
fichcliente.close();
}
catch (IOException e)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
}
cara, o erro estava dando quando iniciava o programa e lia o arquivo,
mesmo que o arquivo não tivesse nada, ele lia a primeira linha, agora eu fiz uma verificação:
se o arquivo estiver Vazio ele nem entra para fazer leitura.
De repente vc vai ter que criar um novo fiqueiro clientes.txt para ele ficar Vazio msm
Ahh, dei uma ajeitadinha em outras coisas tbm, mas veja se tá funcionando blz agora, testei e tudo ok :lol:,
segue o código:
nome do arquivo CadastrarCliente.java //cuidar nas letras maisculas e minusculas
import javax.swing.*;
import javax.swing.text.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import java.io.*;
public class CadastrarCliente extends JFrame implements ActionListener
{
private JLabel lblcodcliente, lblnome, lblbairro,lbllocalidade, lbldata, lblvalor;
private JTextField txtcodcliente, txtnome, txtbairro, txtdata, txtvalor;
String[] localidades ={"Bengo","Benguela","Bié","Cabinda","Cuando-Cubango","Cunene","Kwanza-Norte","Kwanza-Sul","Huambo","Huíla","Luanda","Lunda-Norte","Lunda-Sul","Malanje","Moxico","Namibe","Uíge","Zaire"};
private JComboBox localidade;
private JPanel painelbotoes,painellabeltext;
private JButton cadastrar, cancelar;
public int codigoAtual=1; //o Código inicial é um, caso queira começar com Zero só mudar
public CadastrarCliente()
{
super("..:BPC:..Cadastrar Cliente");
constrform();
setSize(250,250);
setResizable(false);
setLocationRelativeTo(null);
pack();
setVisible(true);
}
public void codigoautomatico()
{
try
{
String linha = new String("");
File ficheiro = new File("clientes.txt");
FileReader fr = new FileReader(ficheiro);
BufferedReader br = new BufferedReader(fr);
//O Erro estava dando neste Trecho, pois ele lia a primeira linha do arquivo
//usando este if Abaixo, ele verifica se o ficheiro estiver vazio, ele não faz a contagem
if(ficheiro.length()==0) //verifica se o Ficheiro está vazio
{
JOptionPane.showMessageDialog(null, "Ficheiro VAZIO");
}
else
{
while((linha=br.readLine())!= null)
{
codigoAtual++;
}
}
br.close();
}
catch(IOException exc)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
}
public void constrform()
{
codigoautomatico();
painellabeltext = new JPanel();
painellabeltext.setLayout(new GridLayout(6,2));
lblcodcliente = new JLabel("Codigo do Cliente", SwingConstants.RIGHT);
lblnome = new JLabel("Nome", SwingConstants.RIGHT);
lblbairro = new JLabel("Bairro", SwingConstants.RIGHT);
lbllocalidade = new JLabel("Localidade", SwingConstants.RIGHT);
lbldata = new JLabel("Data", SwingConstants.RIGHT );
lblvalor = new JLabel("Valor", SwingConstants.RIGHT);
txtcodcliente = new JTextField();
txtcodcliente.setText(""+codigoAtual);
txtcodcliente.setEditable(false);
//txtcodcliente.getText();
txtnome = new JTextField();
//txtnome.geText();
//if (txtnome.getString().trim().length())
//JOptionPane.showMessageDialog(null,"Por favor informe o seu nome");
txtbairro = new JTextField();
//txtbairro.geText();
localidade = new JComboBox(localidades);
//localidade.geText();
txtdata = new JTextField(criaData());//Adiciona data a JTextField
txtdata.setEnabled(false);
//txtdata.geText();
txtvalor = new JTextField();
//txtvalor.setSize(8,8);
txtvalor.setDocument(new validacarecteres());
//txtvalor.geText();
cadastrar = new JButton("Cadastrar");
cadastrar.addActionListener(this);
cancelar = new JButton("Cancelar");
cancelar.addActionListener(this);
painellabeltext.add(lblcodcliente);
painellabeltext.add(txtcodcliente);
painellabeltext.add(lblnome);
painellabeltext.add(txtnome);
painellabeltext.add(lblbairro);
painellabeltext.add(txtbairro);
painellabeltext.add(lbllocalidade);
painellabeltext.add(localidade);
painellabeltext.add(lbldata);
painellabeltext.add(txtdata);
painellabeltext.add(lblvalor);
painellabeltext.add(txtvalor);
painelbotoes = new JPanel();
painelbotoes.add(cadastrar);
painelbotoes.add(cancelar);
getContentPane().add(painellabeltext,BorderLayout.CENTER);
getContentPane().add(painelbotoes, BorderLayout.SOUTH);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
String criaData()
{
Calendar data = Calendar.getInstance();
return data.get(5) + "/" + data.get(2) + "/" + data.get(1);
}
//Classe que não permite que seja inserido caracteres na JTextField
class validacarecteres extends PlainDocument
{
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
{
char digito;
boolean numerico = true;
for(int i = 0; i < str.length(); i++)
{
digito = str.charAt(i);
if(!Character.isDigit(digito))
{
numerico = false;
break;
}
}
if(numerico)
super.insertString(offs, str, a);
}
}
public void actionPerformed(ActionEvent event)
{
if(event.getSource().equals(cadastrar))
{
ObjCliente cliente = new ObjCliente();//Instanciamento do JAVABEAN
if(txtnome.getText().trim().equals(""))
{
JOptionPane.showMessageDialog(null,"Por favor informe o nome do(a) cliente","BPC",JOptionPane.INFORMATION_MESSAGE);
txtnome.grabFocus();
}
else if(txtbairro.getText().trim().equals(""))
{
JOptionPane.showMessageDialog(null,"Por favor informe o o bairro do(a) cliente","BPC",JOptionPane.INFORMATION_MESSAGE);
txtbairro.grabFocus();
}
else if(txtvalor.getText().trim().equals(""))
{
JOptionPane.showMessageDialog(null,"Por favor informe o valor","BPC",JOptionPane.INFORMATION_MESSAGE);
txtvalor.grabFocus();
}
else
{
cliente.setcodigo(Integer.parseInt(txtcodcliente.getText()));
cliente.setnome(txtnome.getText());
cliente.setbairro(txtbairro.getText());
cliente.setlocalidade((String) localidade.getSelectedItem());//Casting de localidade
cliente.setdata(txtdata.getText());
cliente.setvalor(Double.parseDouble(txtvalor.getText()));
Operacoes cadastro = new Operacoes();
cadastro.adiciona(cliente);//Instancia a classe operações e nessa referencia vai chamar o metodo adiciona
//dispose();
codigoAtual++;
txtcodcliente.setText(""+codigoAtual);
txtnome.setText("");
txtbairro.setText("");
txtvalor.setText("");
}
}
else if(event.getSource().equals(cancelar))
{
this.dispose();
}
}
public static void main(String args[])
{
new CadastrarCliente();
}
}
nome do arquivo Opercacoes.java //cuidar nas letras maiusculas
import java.io.*;
import javax.swing.JOptionPane;
public class Operacoes
{
private String ficheiro = "clientes.txt";
FileWriter fichcliente = null;
BufferedReader br = null;
FileReader fr = null;
public void adiciona(ObjCliente adicionar)
{
try
{
fichcliente = new FileWriter(ficheiro,true);
fichcliente.write(adicionar.getcodigo()+"");
fichcliente.write("|");
fichcliente.write(adicionar.getnome());
fichcliente.write("|");
fichcliente.write(adicionar.getbairro());
fichcliente.write("|");
fichcliente.write(adicionar.getlocalidade());
fichcliente.write("|");
fichcliente.write(adicionar.getdata());
fichcliente.write("|");
fichcliente.write(adicionar.getvalor()+"");
fichcliente.write("\r\n");
JOptionPane.showMessageDialog(null,"O cliente " + adicionar.getnome() + " foi com sucesso","BPC",JOptionPane.INFORMATION_MESSAGE);
//System.out.println(fichcliente.read());
fichcliente.close();
}
catch (IOException e)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
}
public void pesquisa(ObjCliente pesquisar)
{
try
{
String linha = null;
fr = new FileReader(ficheiro);
br = new BufferedReader(fr);
while((linha=br.readLine())!=null)
{
if(linha.equals(pesquisar.getcodigo()+""))
JOptionPane.showMessageDialog(null,"O codigo inserido encotra-se no ficheiro","BPC",JOptionPane.ERROR_MESSAGE);//Mensagem de Teste
else
JOptionPane.showMessageDialog(null,"O cliente com o codigo " + pesquisar.getcodigo() + " não se encontra cadastrado no sistema","BPC",JOptionPane.ERROR_MESSAGE);
}
br.close();
}
catch (IOException e)
{
JOptionPane.showMessageDialog(null,"Erro ao abrir o ficheiro","BPC",JOptionPane.ERROR_MESSAGE);
}
}
}
nome do arquivo ObjCliente.java //cuidar nas letras maiusculas
import java.util.*;
public class ObjCliente
{
private int codigo;
private String nome;
private String bairro;
private String localidade;
private String data;
private double valor;
public int getcodigo()
{
return this.codigo;
}
public void setcodigo(int codigo)
{
this.codigo = codigo;
}
public String getnome()
{
return this.nome;
}
public void setnome(String nome)
{
this.nome = nome;
}
public String getbairro()
{
return this.bairro;
}
public void setbairro(String bairro)
{
this.bairro = bairro;
}
public String getlocalidade()
{
return this.localidade;
}
public void setlocalidade(String localidade)
{
this.localidade = localidade;
}
public String getdata()
{
Calendar data = Calendar.getInstance();
return data.get(5) + "/" + data.get(2) + "/" + data.get(1);
}
public void setdata(String data)
{
this.data = data;
}
public double getvalor()
{
return this.valor;
}
public void setvalor(double valor)
{
this.valor = valor;
}
}
se deu tudo certo, nao esqueça de colocar o [RESOLVIDO] no seu tópido
[]'s