Duvida com JTextField's e Arrays [resolvido]

16 respostas
sanzo

Boa Noite,

Eu estou fazendo um exercicio que é muito importante, o qual esta valendo minha prova…

não tenho nada digno ainda, portanto não voi postar meu codgo :oops: mas o que acontece é o seguinte!

estou montanto uma “agenda de contatos” beeeem simples… onde ela armazena e busca em um arquivos txt…

sendo que os dados que ela armazena são: nome, telefone residencial, telefone celular, e-mail
e vou fazer com que ela faça a busca tendo pelo menos um desses dados…

criei meio que na unha uma interface gráfica que não esta muito boa mas esta funcional usando o FlowLayout…
ela contem:

4 - JLabel
4 - JTextField
2 - JButton
1 - JTextArea

tenho 2 metodos: um q adciona os contatos e o outro que faz a busca no .txt…

quero passar para um Array os dados dos JTextField’s e compara-los com um outro array de dados saidos do .txt… mas o caso é que sei que a duvida é besta mais… não sei como fazer para colocar em um array os dados das JTextField’s… para depois serem comparadas…

alguem pode me ajudar?

desde ja obrigado

16 Respostas

sanzo

ninguem?

D

se é o q entendi… é só fazer assim:
array[indice] = nomeDoJLabel.text;
esse text, é pq ele vai pegar o que esta dentro do label…
vlw

M

Tbm n sei se entendi.

Mas no seu caso acredito que você deverá primeiro criar um metodo para ler o seu arquivo txt e salvar linha a linha em um ArrayList de Contatos (classe que você ja deve ter no seu sistema)

Depois disso crie sobrescreva o metodo equals e o hash code de Contatos, para determinar a igualdade.

Apos clicar no botao voce cria um listener que criara um novo Objeto de Contatos com as informacoes dos JTextFields

att = JTF.getText()

apos isso é só dar uma percorrida com o seu elemento no seu ArrayList comparando com equals sobrescrito, se entrar no if do equals eles sao iguais, dai você segue a sua logica
:slight_smile:

sanzo

Valew Mustang89,

era essa a lógica que estava buscando!

vou fazer e assim que tiver algo eu posto!

muito obrigado…

sanzo

Mais uma coisa…

estou com um problema no methodo que insere no .txt os dados dos contatos cadastrados…

o que ta acontecendo é o seguinte:

ao clicar em Cadastrar, o methodo salva sempre na mesma linha do .txt, alguem pode da uma dica de como fazer im IF ELSE para que o methodo procure uma linha vazia e salve os dados nela?

eis o codigo:

package AgendaDeContatos;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Agenda implements ActionListener {

	JFrame janela = new JFrame();
	JPanel painel = new JPanel();
	JLabel espaco2 = new JLabel("                  ");//gambiarra para alinhar os campos
	JLabel espaco = new JLabel("              ");//Ganbiarra para alinhar os campos 02
	JLabel lbNome = new JLabel("Nome:");
	JLabel lbTelResidencia = new JLabel("Tel. Residencial:");
	JLabel lbTelCelular = new JLabel("Tel. Celular:");
	JLabel lbEmail = new JLabel("        E-mail:");
	JTextField tfNome = new JTextField(20);
	JTextField tfTelResidencia = new JTextField(8);
	JTextField tfTelCelular = new JTextField(8);
	JTextField tfEmail = new JTextField(20);
	JButton btCadastrar = new JButton("Cadastrar");
	JButton btPesquisar = new JButton("Pesquisar");
	JTextArea retorno = new JTextArea(13,30);	
	
	public static void main(String[] args) {
		new Agenda();
	}
	
	private Agenda(){
		
		janela.setTitle("Agenda de Contatos");
		janela.setSize(400,500);
		janela.setLocation(50, 50);
		janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		painel.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 20));
		painel.add(lbNome);
		painel.add(tfNome);
		painel.add(lbTelResidencia);
		painel.add(tfTelResidencia);
		painel.add(espaco);
		painel.add(lbTelCelular);
		painel.add(tfTelCelular);
		painel.add(espaco2);
		painel.add(lbEmail);
		painel.add(tfEmail);
		painel.add(btCadastrar);
		btCadastrar.addActionListener(this);
		painel.add(btPesquisar);
		btPesquisar.addActionListener(this);
		painel.add(retorno);
		janela.add(painel);
		janela.setVisible(true);		
		
	
				
	}
	
	
	
	
	
	public void cadastra() throws IOException {
		BufferedWriter escreve = new BufferedWriter(new FileWriter("c:/contato.txt"));
		String linha;
		linha = tfNome.getText();
		linha += ";";
		linha += tfTelResidencia.getText();
		linha += ";";
		linha += tfTelCelular.getText();
		linha += ";";
		linha += tfEmail.getText();
		linha += ";";
		escreve.write(linha);
		escreve.newLine();
		escreve.close();
		
	}
	
	


	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == btCadastrar){
			try {
				cadastra();
				JOptionPane.showMessageDialog(null, "Contato cadastrado com sucesso!");
				tfNome.setText("");
				tfTelResidencia.setText("");
				tfTelCelular.setText("");
				tfEmail.setText("");
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		
	}
		
	}

Por favor não reparem nos defeitos da interface gráfica, n~eo tenho experiencia com elas ainda e FIZ umas loucuras que de alguma forma a deixou “utilizavel”… rsrsrs…

obrigado

S

sanzo:
Mais uma coisa…

estou com um problema no methodo que insere no .txt os dados dos contatos cadastrados…

o que ta acontecendo é o seguinte:

ao clicar em Cadastrar, o methodo salva sempre na mesma linha do .txt, alguem pode da uma dica de como fazer im IF ELSE para que o methodo procure uma linha vazia e salve os dados nela?

eis o codigo:

package AgendaDeContatos;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Agenda implements ActionListener {

	JFrame janela = new JFrame();
	JPanel painel = new JPanel();
	JLabel espaco2 = new JLabel("                  ");//gambiarra para alinhar os campos
	JLabel espaco = new JLabel("              ");//Ganbiarra para alinhar os campos 02
	JLabel lbNome = new JLabel("Nome:");
	JLabel lbTelResidencia = new JLabel("Tel. Residencial:");
	JLabel lbTelCelular = new JLabel("Tel. Celular:");
	JLabel lbEmail = new JLabel("        E-mail:");
	JTextField tfNome = new JTextField(20);
	JTextField tfTelResidencia = new JTextField(8);
	JTextField tfTelCelular = new JTextField(8);
	JTextField tfEmail = new JTextField(20);
	JButton btCadastrar = new JButton("Cadastrar");
	JButton btPesquisar = new JButton("Pesquisar");
	JTextArea retorno = new JTextArea(13,30);	
	
	public static void main(String[] args) {
		new Agenda();
	}
	
	private Agenda(){
		
		janela.setTitle("Agenda de Contatos");
		janela.setSize(400,500);
		janela.setLocation(50, 50);
		janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		painel.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 20));
		painel.add(lbNome);
		painel.add(tfNome);
		painel.add(lbTelResidencia);
		painel.add(tfTelResidencia);
		painel.add(espaco);
		painel.add(lbTelCelular);
		painel.add(tfTelCelular);
		painel.add(espaco2);
		painel.add(lbEmail);
		painel.add(tfEmail);
		painel.add(btCadastrar);
		btCadastrar.addActionListener(this);
		painel.add(btPesquisar);
		btPesquisar.addActionListener(this);
		painel.add(retorno);
		janela.add(painel);
		janela.setVisible(true);		
		
	
				
	}
	
	
	
	
	
	public void cadastra() throws IOException {
		BufferedWriter escreve = new BufferedWriter(new FileWriter("c:/contato.txt"));
		String linha;
		linha = tfNome.getText();
		linha += ";";
		linha += tfTelResidencia.getText();
		linha += ";";
		linha += tfTelCelular.getText();
		linha += ";";
		linha += tfEmail.getText();
		linha += ";";
		escreve.write(linha);
		escreve.newLine();
		escreve.close();
		
	}
	
	


	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == btCadastrar){
			try {
				cadastra();
				JOptionPane.showMessageDialog(null, "Contato cadastrado com sucesso!");
				tfNome.setText("");
				tfTelResidencia.setText("");
				tfTelCelular.setText("");
				tfEmail.setText("");
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		
	}
		
	}

Por favor não reparem nos defeitos da interface gráfica, n~eo tenho experiencia com elas ainda e FIZ umas loucuras que de alguma forma a deixou “utilizavel”… rsrsrs…

obrigado

Vc tem que mandar um append no construtor do FileWriter como true, assim:

BufferedWriter escreve = new BufferedWriter(new FileWriter("c:/contato.txt", true));

Abraço.

sanzo

Desculpe a falta de conhecimento, mas…
em que exatamente isso ajudaria?

poderia ser mais claro… mas mesmo assim obrigado

M

Bom tente fazer de um jeito que o JAVA já faz mais automatico…

Serialize a Classe de Contatos apenas implenetando a interface Serializable

import java.io.Serializable;

Apos isso grave todos os seus objetos em um ArrayList como eu tinha sugerido anteriormente.

e utilize ObjectOutputStream/ObjectInputStream para manusear os seus dados no arquivo:

segue um exemplo:

Classe Carro:

import java.io.Serializable;


public class Carro implements Serializable {

	private String marca;
	private String modelo;
	
	public Carro(String marca, String modelo) {
		super();
		this.setMarca(marca);
		this.setModelo(modelo);
	}
	
	public String getMarca() {
		return marca;
	}
	public void setMarca(String marca) {
		this.marca = marca;
	}
	public String getModelo() {
		return modelo;
	}
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((getMarca() == null) ? 0 : getMarca().hashCode());
		result = prime * result + ((getModelo() == null) ? 0 : getModelo().hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Carro other = (Carro) obj;
		if (getMarca() == null) {
			if (other.getMarca() != null)
				return false;
		} else if (!getMarca().equals(other.getMarca()))
			return false;
		if (getModelo() == null) {
			if (other.getModelo() != null)
				return false;
		} else if (!getModelo().equals(other.getModelo()))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Carro [marca=" + this.getMarca() + ", modelo=" + this.getModelo() + "]";
	}

	
}

Classe de Teste de IO:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;


public class IO {

	public static void main(String[] args) {
		
		List<Carro> list = new ArrayList<Carro>();
		List<Carro> list2 = new ArrayList<Carro>();
		
		list.add(new Carro("FIAT", "PALIO"));
		list.add(new Carro("FIAT", "UNO"));
		list.add(new Carro("CHEVROLET", "CELTA"));
		list.add(new Carro("CHEVROLET", "VECTRA"));
		list.add(new Carro("CHEVROLET", "CORSA"));
		
		
		try {
			FileOutputStream file = new FileOutputStream("cars.ser");
			ObjectOutputStream objs = new ObjectOutputStream(file);
			
			objs.writeObject(list);
			
			objs.flush();
			objs.close();
			file.close();
			
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
		try {
            
            FileInputStream file = new FileInputStream("cars.ser");
            ObjectInputStream objs = new ObjectInputStream(file);;
            
            list2 = (ArrayList<Carro>)objs.readObject();
            
            
    		for (Carro carro : list2) {
				System.out.println(carro);
			}
            
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
	}
}

Espero ter ajudado…

Qualquer dúvida continue postando
:slight_smile:

sanzo

Muito obrigado a todos…

minha Agenda de contatos ja esta armazenando perfeitamente os dados inseridos nos JTextFields…

ma estou com um problema no Methodo que faz as buscas no txt para retornar na JTextArea

Olhem o que tenho:

public void busca() throws IOException{
		BufferedReader leitura = new BufferedReader(new FileReader("c:/contato.txt"));
		String linha;
		String dados[];
		List<Contato> lc = new ArrayList<Contato>();
		Contato cont;
		for (int i = 0; ;i++ ){
			linha = leitura.readLine();
			if(linha == null) break;
			dados = linha.split(";");
			cont = new Contato();
			cont.setNome(dados[0]);
			cont.setTlFixo(dados[1]);
			cont.setTlMovel(dados[2]);
			cont.setEmail(dados[3]);
			lc.add(cont);
			}

esse metodo ai, esta fazendo a busca no txt e armazenando no LIST… eu testei e ate ai tudo bem… mas como eu faço pra que o codigo cheque se o nome (string) que o usuario colocou no JTextField tfNome esta na lista e fazer com que se ele encontrar, mostrar na JTextArea?

eu estava usando um

retorno.append(linha);

mas não esta funcionando e tenho certeza que esta errado… :roll:

if(lc.contains(tfNome.getText());

tambem não esta funcionando… esta faltando algo que não sei o que é!!! :?: :shock:

muito obrigado

M

Seu ArrayList é de Contato, portanto nunca conterá uma String (o texto do TextField). O jeito é fazer um loop que filtre os resultados. Isso quer dizer que você deverá fazer um for por todos os contatos e verificar se o nome do contato contém o texto que está no TextField. Algo como:

List<Contato> buscados = new ArrayList<Contato>();
for (Contato c : lc) {
    if (c.getNome().contains(tfNome.getText())) {
        buscados.add(c);
    }
}

Aí você teria todos os contatos filtrados no List “buscados”. A mesma coisa pode ser feita para telefone, emails, etc. Nesse caso, me parece interessante usar um Set ao invés de List, pois se o mesmo Contato passar por mais de um critério de busca ele não deve aparecer duas vezes na lista.

sanzo

Muito obrigado mesmo a todos que ajudaram a sanar as minhas grandes duvidas

A Agenda de contatos esta funcionando muito bem, mas ainda falta alguns ajustes…

o codigo ficou assim:

a class Contato

package AgendaDeContatos;



public class Contato {
	
	private String nome;
	private String tlFixo;
	private String tlMovel;
	private String email;
	
	
	
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getTlFixo() {
		return tlFixo;
	}
	public void setTlFixo(String tlFixo) {
		this.tlFixo = tlFixo;
	}
	public String getTlMovel() {
		return tlMovel;
	}
	public void setTlMovel(String tlMovel) {
		this.tlMovel = tlMovel;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	@Override
	public String toString() {
		return getNome()+";"+getTlFixo()+";"+getTlMovel()+";"+getEmail();
	}
	
	  	
}

e a class Agenda

package AgendaDeContatos;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Agenda implements ActionListener {

	JFrame janela = new JFrame();
	JPanel painel = new JPanel();
	JLabel espaco2 = new JLabel("                  ");//gambiarra para alinhar os campos
	JLabel espaco = new JLabel("              ");//Ganbiarra para alinhar os campos 02
	JLabel lbNome = new JLabel("Nome:");
	JLabel lbTelResidencia = new JLabel("Tel. Residencial:");
	JLabel lbTelCelular = new JLabel("Tel. Celular:");
	JLabel lbEmail = new JLabel("        E-mail:");
	JTextField tfNome = new JTextField(20);
	JTextField tfTelResidencia = new JTextField(8);
	JTextField tfTelCelular = new JTextField(8);
	JTextField tfEmail = new JTextField(20);
	JButton btCadastrar = new JButton("Cadastrar");
	JButton btPesquisar = new JButton("Pesquisar");
	JTextArea retorno = new JTextArea(13,30);	
	
	public static void main(String[] args) {
		new Agenda();
	}
	
	private Agenda(){
		
		janela.setTitle("Agenda de Contatos");
		janela.setSize(400,500);
		janela.setLocation(50, 50);
		janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		painel.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 20));
		painel.add(lbNome);
		painel.add(tfNome);
		painel.add(lbTelResidencia);
		painel.add(tfTelResidencia);
		painel.add(espaco);
		painel.add(lbTelCelular);
		painel.add(tfTelCelular);
		painel.add(espaco2);
		painel.add(lbEmail);
		painel.add(tfEmail);
		painel.add(btCadastrar);
		btCadastrar.addActionListener(this);
		painel.add(btPesquisar);
		btPesquisar.addActionListener(this);
		painel.add(retorno);
		janela.add(painel);
		janela.setVisible(true);		
						
	}
	
	public void cadastra() throws IOException {
		BufferedWriter escreve = new BufferedWriter(new FileWriter("c:/contato.txt",true));
		String linha;
		linha = tfNome.getText();
		linha += ";";
		linha += tfTelResidencia.getText();
		linha += ";";
		linha += tfTelCelular.getText();
		linha += ";";
		linha += tfEmail.getText();
		linha += ";";
		escreve.write(linha);
		escreve.newLine();
		escreve.close();
		
		
	}
	public void busca() throws IOException{
		BufferedReader leitura = new BufferedReader(new FileReader("c:/contato.txt"));
		String linha;
		String dados[];
		List<Contato> lc = new ArrayList<Contato>();
		Contato cont;
		for (int i = 0; ;i++ ){
			linha = leitura.readLine();
			if(linha == null) break;
			dados = linha.split(";");
			cont = new Contato();
			cont.setNome(dados[0]);
			cont.setTlFixo(dados[1]);
			cont.setTlMovel(dados[2]);
			cont.setEmail(dados[3]);
			lc.add(cont);
			}
		for(Contato c : lc){
			if(c.getNome().contains(tfNome.getText())){
				retorno.append("Nome: "+c.getNome()+'\n'+"Tel. Residencial: "+c.getTlFixo()+'\n'+"Tel. Celular: "+c.getTlMovel()+'\n'+"E-mail: "+c.getEmail()+'\n');
			}
			
		}
			
			}
			
		
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==btPesquisar){
			try {
				busca();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		if(e.getSource() == btCadastrar){
			try {
				cadastra();
				JOptionPane.showMessageDialog(null, "Contato cadastrado com sucesso!");
				tfNome.setText("");
				tfTelResidencia.setText("");
				tfTelCelular.setText("");
				tfEmail.setText("");
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		
	}
		
	}

o que ta faltando é o seguinte…
não consigo limpar a JTextArea antes de cada pesquisa

retorno.append(null)

ou um

retorno.append("")

igual como eu fiz nas JTextField’s apos cada cadastro mas não funciona…
e a cada pesquisa que se faz na Agenda ela coloca um resultado embaixo do outro…
e o pior acontece se clicar no botão pesquisar sem ter nada escrito na tfNome, pois todos os cotatos cadastrados aparecem em fila no JTextArea…

mas acho que como esta ja vou garantis uma boa nota!!! rsrs muito obrigado a todos nmesmo… :smiley:

Allan_Barcelos

Cara tenta o MigLayout, pode te ajudar com o alinhamento e talz, vale a pena tu dar uma olhada.

sanzo

é, eu sei que ficou estranho o que eu fiz… mas como foi meio as preças e o instrutor pouco falou sobre interfaces graficas eu acho que vou ser o unico a fazer um codigo que tenha uma interface grafica…

pelo menos eu acho! rsrsrsrs…

mas vou olhar simm… obrigado pela dica!

M

sanzo:
o que ta faltando é o seguinte…
não consigo limpar a JTextArea antes de cada pesquisa

retorno.append(null)

ou um

retorno.append("")

igual como eu fiz nas JTextField’s apos cada cadastro mas não funciona…
e a cada pesquisa que se faz na Agenda ela coloca um resultado embaixo do outro…
e o pior acontece se clicar no botão pesquisar sem ter nada escrito na tfNome, pois todos os cotatos cadastrados aparecem em fila no JTextArea…


O append apenas adiciona o texto ao final do que já está no seu JTextArea. Para mudar o texto use:

retorno.setText("seu texto");

No caso, para tirar tudo o que está escrito, use:

retorno.setText("");

E também sugiro que veja o MigLayout pois pode ajudar mesmo (é um gerenciador de leiaute muito bom, talvez o melhor que exista).

sanzo

.

sanzo

Rapaz…
Que vergonha, a solução estava bem na minha cara!

eu fiz a mesma coisa com os JTextFields e nem me liguei a tentar fazer o mesmo com o JTextArea…
valew mesmo, isso me alerta a prestar mai atenção no que se faz e como se faz!

muito obrigado mesmo!


No caso, para tirar tudo o que está escrito, use:
view plaincopy to clipboardprint?

  1. retorno.setText("");

retorno.setText("");
E também sugiro que veja o MigLayout pois pode ajudar mesmo (é um gerenciador de leiaute muito bom, talvez o melhor que exista).

Criado 16 de junho de 2010
Ultima resposta 21 de jun. de 2010
Respostas 16
Participantes 6