Ajuda com Jtable

9 respostas
G

Bom galera boa tarde estou com a seguinte dificuldade tenho uma Jtable e tenho que preenche-la com um arquivo texto, fiz um abstract table model e as informaçoes da tablea estao divididads por virgula, meu codigo

public class Tabela extends AbstractTableModel{
    //O nome das colunas da sua tabela
      private String [] colunas = {"Nome","Email","Interesse"};
      //O que vai ser preenchido em cada coluna
    ArrayList<String> colecao = new ArrayList<String>();
      //Essa parte teremos que olhar como vai ser a separaçao dos atributos
    public Tabela(){
      File ArqTxt = new File("C://lista.txt");
      FileInputStream fi = null;
      try {
                  fi = new FileInputStream(ArqTxt);
            } catch (FileNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
            String readLine = "";
            String conteudo = "";
            Scanner scan = new Scanner(fi);
        while (scan.hasNext()) {
            readLine = scan.next();

            conteudo += readLine;
        }
    }
    //Conta o numero de linhas
    public int getRowCount() {
        return colecao.size();
    }
    //Conta o numero de colunas
    public int getColumnCount() {
        return colunas.length;
    }
    
    //Pega o nome das colunas
    @Override
    public String getColumnName(int column) {
        return colunas[column];
    }
    //retorna de os objetos que voce quer em cada linha
    public Object getValueAt(int rowIndex, int columnIndex) {
         
        if(columnIndex == 0)
        {
            
        }
        if(columnIndex == 1)
        {
            
        }else{

        }
    }
    //Lista os objetos e da refresh na table
    public void listar()
    {
       
        fireTableDataChanged();
    }
}

9 Respostas

ViniGodoy

Você deve separar as coisas:

  1. Crie uma classe chamada Contato, com os campos nome, interesse e email;
  2. Crie um método estático nessa classe, que retorne uma lista de contatos a partir do arquivo;
  3. Crie um TableModel que liste uma lista de contatos. Esse aqui lista livros, é só adaptar:
    http://www.guj.com.br/posts/list/132698.java#714736
G
ViniGodoy:
Você deve separar as coisas:

1. Crie uma classe chamada Contato, com os campos nome, interesse e email;
2. Crie um método estático nessa classe, que retorne uma lista de contatos a partir do arquivo;
3. Crie um TableModel que liste uma lista de contatos. Esse aqui lista livros, é só adaptar:
http://www.guj.com.br/posts/list/132698.java#714736

Cara eu consegui aqui so to com uma duvida besta por exemplo qdo eu cadastro eu quero q a tabela atualiza como eu faria isso?

estou chamando esse metodo listar so que ele nao esta funcionando pq?

aqui esta meu codigo e ele esta funcionando
public class Tabela extends AbstractTableModel{
    //As colunas da sua tabela
	private String [] colunas = {"Nome","Celular","Interesse"};
	//O que vai ser preenchido em cada coluna
    ArrayList<String> nome = new ArrayList<String>();
    ArrayList<String> email = new ArrayList<String>();
    ArrayList<String> interesse = new ArrayList<String>();
    
    public Tabela(){
    	File ArqTxt = new File("C://lista.txt");
    	FileInputStream fi = null;
    	
    	try {
			fi = new FileInputStream(ArqTxt);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String readLine = "";
		String conteudo = "";
		Scanner scan = new Scanner(fi);
        while (scan.hasNext()) {
        	readLine = scan.next();
        	String b[] = readLine.split(",");
            nome.add(b[0]);
            email.add(b[1]);
            interesse.add(b[2]);
        }
    }
    //Conta o numero de linhas
    public int getRowCount() {
        return nome.size();
    }
    //Conta o numero de colunas
    public int getColumnCount() {
        return colunas.length;
    }
    
    //Pega o nome das colunas
    @Override
    public String getColumnName(int column) {
        return colunas[column];
    }
    //retorna de os objetos que voce quer em cada linha
    public Object getValueAt(int rowIndex, int columnIndex) {
         
        if(columnIndex == 0)
        {	for(int i=0; i<nome.size();i++){
        		return nome.get(i);
        }
        }if(columnIndex == 1){
        	for(int i=0; i><nome.size();i++)
        	return email.get(i);
        }else
        {	for(int i=0; i><nome.size();i++)
        	return interesse.get(i);
        }
        return null;

    }
    public void listar(){
    	fireTableDataChanged();
    }
 }
;
ViniGodoy

Seu model não deveria ter 3 ArrayLists, só 1. É melhor você criar uma classe que contenha essas 3 informações.

Aí, basta adicionar no model um método de add, e usar o fireTableRowsInserted para dizer que uma linha foi adicionada:

No caso do seu model, ficaria assim:

public void add(String nome, String celular, String email) { this.nome.add(nome); this.celular.add(celular); this.email.add(email); fireTableRowsInserted(nome.length()-1, nome.length()-1); }

No seu form, chame esse método.

Mas aconselho fortemente a não trabalhar com 3 arraylists, e sim fazer uma classe, e trabalhar com uma lista só.

G

ViniGodoy:
Seu model não deveria ter 3 ArrayLists, só 1. É melhor você criar uma classe que contenha essas 3 informações.

Aí, basta adicionar no model um método de add, e usar o fireTableRowsInserted para dizer que uma linha foi adicionada:

No caso do seu model, ficaria assim:

public void add(String nome, String celular, String email) { this.nome.add(nome); this.celular.add(celular); this.email.add(email); fireTableRowsInserted(nome.length()-1, nome.length()-1); }

No seu form, chame esse método.

Mas aconselho fortemente a não trabalhar com 3 arraylists, e sim fazer uma classe, e trabalhar com uma lista só.

Ta mas que tipo de lista eu iria trabalhar pra fazer a contagem das linhas?

ViniGodoy

Só estou falando para vc criar uma classe assim:

public class Contato {
   private String nome;
   private String email;
   private String celular;

   public Contato(String nome, String email, String celular) {
      this.nome = nome.
      this.email = email;
      this.celular = celular;
   }
   public String getNome() { return nome; }
   public String getCelular() { return celular; }
   public String getEmail() { return email; }

   public static List<Contato> carregarDoArquivo(String nomeArquivo) {
      //Aqui vc põe o código que lê os contatos do arquivo txt e gera a lista de contatos.
   }
}
E, depois, no seu TableModel, você cria um único
List<Contato> contatos = new ArrayList<Contato>();

Ao invés de 3 listas.

G

Entendi bacana =) é agora c ta usando OO,mas é que estou fazendo algo bem simples mesmo, mas aquele metodo fireTableRowsInserted(nome.length()-1, nome.length()-1); ele faz update toda vez q adicionar?

ViniGodoy

Com aquele método vc avisa a tabela que uma linha foi adicionada naquela posição. E aí ela desenhar aquela linha.

G

Cara muito obrigado mesmo pela ajuda =)

G

Cara vc me ajudou bastante mas surgiu algums duvidas bestas minha classe table model ficou assim

public class Tabela extends AbstractTableModel{
    //As colunas da sua tabela
      private String [] colunas = {"Nome","Celular","Interesse"};
      //O que vai ser preenchido em cada coluna
    ArrayList<Contato> colecao = new ArrayList<Contato>();
    ArrayList<String> nome = new ArrayList<String>();
    ArrayList<String> email = new ArrayList<String>();
    ArrayList<String> produto = new ArrayList<String>();
    Contato contato = new Contato();

   public Tabela(){
       colecao = (ArrayList<Contato>) contato.carregarDoArquivo();
   }

   public void add(String nome, String produto, String email) {
       this.nome.add(nome);
       this.produto.add(produto);
       this.email.add(email);
       fireTableRowsInserted(nome.length()-1, nome.length()-1);
}

    //Conta o numero de linhas
    public int getRowCount() {
        return nome.size();
    }
    //Conta o numero de colunas
    public int getColumnCount() {
        return colunas.length;
    }

    //Pega o nome das colunas
    @Override
    public String getColumnName(int column) {
        return colunas[column];
    }
    //retorna de os objetos que voce quer em cada linha
    public Object getValueAt(int rowIndex, int columnIndex) {
        contato = colecao.get(rowIndex);
        if(columnIndex == 0)
        {
           return contato.getNome();
        }if(columnIndex == 1){
           return contato.getEmail();
        }else
        {   return contato.getProduto();
        }
    }
}

e ja a minha classe contato ficou assim

public class Contato {
   private String nome;
   private String email;
   private String produto;

   public Contato(){

   }
   
   public Contato(String nome, String email, String produto) {
      this.nome = nome;
      this.email = email;
      this.produto = produto;
   }
   public String getNome() { return nome; }
   public String getProduto() { return produto; }
   public String getEmail() { return email; }

   public static List<Contato> carregarDoArquivo() {
     File ArqTxt = new File("C://lista.txt");
     FileInputStream fi = null;
     List<Contato> lista = new ArrayList<Contato>();
      try {
                  fi = new FileInputStream(ArqTxt);
            } catch (FileNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
            String readLine = "";
            String conteudo = "";
            Scanner scan = new Scanner(fi);
            int cont=0;
        while (scan.hasNext()) {
            readLine = scan.next();
            cont++;
            String b[] = readLine.split(",");
            Contato c = new Contato(b[0], b[1], b[2]);
            
            lista.add(c);
          /*  System.out.print(interesse);
             System.out.print(nome);
              System.out.print(email);*/
        }
     return lista;
   }
   public void add(String nome,String email,String produto) throws IOException{
        File Arqtxt = new File("C://lista.txt");
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(Arqtxt);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
        String readLine="";
        String conteudo="";
        Scanner scan = new Scanner(fis);
        while (scan.hasNext()) {
            readLine = scan.next();
            conteudo += readLine +"\r\n";
        }

        conteudo += nome+","+email+","+produto;

        FileOutputStream fo = null;
        try {
            fo = new FileOutputStream(Arqtxt, false);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            fo.write(conteudo.getBytes());
        } catch (IOException ex) {
            JOptionPane.showInputDialog(null,"Erro na hora de gravar");
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
   }

}

so que ta dando erro.. ve se fiz as alteraçoes como voce sugeriu?
continua nao atualizando a tabela

Criado 29 de dezembro de 2009
Ultima resposta 30 de dez. de 2009
Respostas 9
Participantes 2