Ajuda com JTable e AbstractModel

12 respostas
Henrique_Moraes

Galera, sou iniciante em java e estou com muita dificuldade em utilizar o JTable com o AbstractModel.

Já peguei alguns exemplos, mas mesmo assim nao consegui…

Gostaria de saber como usar o JTable com AbstractModel, alguém tem um exemplo com detalhes de como usar…
se alguém puder ajudar fico grato!

12 Respostas

ViniGodoy

Tem no link da minha assinatura. E se você postar o que você tentou fazer, talvez possamos ajudar.

Henrique_Moraes

ok...

public class RendaTable extends AbstractTableModel {

	Contato rendas = new Contato(); 
	List list = rendas.teste(); 
	
	private String[] titulos = { "Nome", "Telefone1", "Telefone2", "Celular" };
	private Object[][] dados = new Object[getRowCount()][getColumnCount()];

	public RendaTable() {

		Iterator iterator = list.iterator();

		/*for (int i = 0; i < getRowCount(); i++) {

			for (int j = 0; j < getColumnCount(); j++) {
				setValueAt(list,i,j);*/  //  Nao estou conseguindo usar

			}
		}
				
	}
	
	public int getRowCount() {
		return list.size();
	}

	public int getColumnCount() {
		return titulos.length;
	}

	public String getColumnName(int col) {
		return titulos[col];
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		return dados[rowIndex][columnIndex];
	}

	public void setValueAt(Object value, int row, int col) {
		dados[row][col] = value;
	}

aqui esta a class Contato...

public class Contato {
	

	private Connection con;  
    private Statement stmt;
	
	
	
	public List teste() {
		
        List clientes = new ArrayList();  
        
		String url = "jdbc:odbc:Agenda";
		String usuario = "";
		String senha = "";
	
		try{
			Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
			con = DriverManager.getConnection(url, usuario, senha);
		}
		catch (Exception e){
			JOptionPane.showMessageDialog(null,"Conexão não estabelecida","Mensagem do Programa",JOptionPane.ERROR_MESSAGE);
		}
		
		try {  
			stmt = con.createStatement();
			ResultSet resultadoDaPesquisa = stmt.executeQuery("Select* from Cadastro");  
			
			while (resultadoDaPesquisa.next()) {  
				
				clientes.add(resultadoDaPesquisa.getString("Nome"),
                                                  resultadoDaPesquisa.getString("Telefone_1"),
                                                  resultadoDaPesquisa.getString("Telefone_2"));  
			}  
			resultadoDaPesquisa.close();  
			stmt.close();  
			con.close();/
			return clientes;  
			
		
		} 
		catch (SQLException e) { 
			System.out.println(e);  
        }  
		return new ArrayList();  
		}
ViniGodoy

Bom. Não é à toa que você não consegue. Seu código está bem desorganizado, está na cara que você está começando.

Bom, vou te dar umas dicas:

a) Crie uma classe chamada Contato. Nela, você põe os atributos id, nome, telefone1, telefone2 e celular. Ponha os gets e sets, mas não ponha nenhum método para carregar nada do banco. Ponha nela também um construtor, que constrói o contato com base nesses dados.

b) Crie uma classe chamada ContatoDao. Nela, você coloca o método que carrega os contatos do banco. Esse método deverá retornar um List<Contato>;

c) Aí sim, você cria o ContatoTableModel. Nele, você terá um array de strings com o título, e um List<Contato> (no lugar do object[][]). Quando você chegar nessa fase, aí sim, falaremos só do model.

Não se preocupe, você está no caminho certo. Mas um pouco mais de organização te ajudará a chegar no seu objetivo mais facilmente.

Henrique_Moraes

vlw ViniGodoy… vou fazer isto.!

Henrique_Moraes

ViniGodoy... por favor veja se entendi...

Essa é a classe Contato

public class Contato {

	private String nome;
	private String telefone1;
	private String telefone2;
	private String celular;
	
	public Contato(String novoNome, String novoTelefone1, String novoTelefone2, String novoCelular) {  
		this.nome = novoNome;  
		this.telefone1 = novoTelefone1;  
		this.telefone2 = novoTelefone2;  
		this.celular = novoCelular;  
	
    } 
	
	public String getNome() {
		return this.nome;
	}

	public void setNome(String novo) {
		this.nome = novo;
	}
	
	public String getTelefone1() {
		return this.telefone1;
	}

	public void setTelefone1(String novo) {
		this.telefone1 = novo;
	}
	
	public String getTelefone2() {
		return this.telefone2;
	}

	public void setTelefone2(String novo) {
		this.telefone2 = novo;
	}
	
	public String getCelular() {
		return this.celular;
	}

	public void setCelular(String novo) {
		this.celular = novo;
	}

}

Essa é a classe ContatoDao

class ContatoDao{
	
	private Connection con;
	private Statement stmt;
	private List<Contato> lista = new ArrayList<Contato>();

	public List<Contato> ContatoDao() {
		
		String url = "jdbc:odbc:Agenda";
		String usuario = "";
		String senha = "";
	
		try{
			Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
			con = DriverManager.getConnection(url, usuario, senha);
		}
		catch (Exception e){
			JOptionPane.showMessageDialog(null,"Conexão não estabelecida","Mensagem do Programa",JOptionPane.ERROR_MESSAGE);
		}
		
		try {  
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery("Select* from Cadastro");  
			
			while (rs.next()) {  
			
			    Contato contato = new Contato();
				
				contato.setNome(rs.getString("nome"));
                contato.setTelefone1(rs.getString("telefone_1"));
                contato.setTelefone2(rs.getString("telefone_2"));
                contato.setCelular(rs.getString("celular"));
				
				lista.add(contato);
			}  
			
			rs.close();  
			stmt.close();  
			con.close();
		
		} 
		catch (SQLException e) {
			System.out.println(e);  
        }  

		return lista;

}

Essa é a classe ContatoTableModel, que ainda nao está completa.

class  ContatoTableModel extends AbstractTableModel {
    
    private String[] titulos = { "Nome", "Telefone1", "Telefone2", "Celular" };
	private List<Contato> lista;

    public ContatoTableModel(List<Contato> lista) {
        this.lista = new ArrayList<Contato>(list);
    }
	
	public int getRowCount() {
        return lista.size();
    }

    public int getColumnCount() {
        return 4;
    }

}

valeu!

Henrique_Moraes

Alguém pra ajudar??

ViniGodoy

É isso mesmo. E qual é a dúvida?

Matheus_Prado

qual a duvida meu amigo ? :smiley:

Henrique_Moraes

A dúvida é a seguinte, criei uma classe para executar o JTable, mas acontece o seguinte erro :

Exception in thread "main" java.lang.NullPointerException
        at Executa.<init>(Executa.java:27)
        at Executa.main(Executa.java:48)

Aqui está a classe Executa.java

public class Executa extends JInternalFrame{
	
	private JTable tabela;
	
	public Executa(){
		super("Teste");
		
		ContatoDao lista = new ContatoDao();
		List<Contato> lista2 = lista.getLista();
		ContatoTableModel modelo = new ContatoTableModel(lista2); 
		
                tabela.setModel(modelo);
		tabela.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
		tabela.setToolTipText("Selecione uma renda");
		
		JScrollPane scroller = new JScrollPane();
		scroller.setViewportView(tabela);
		scroller.setBounds(new java.awt.Rectangle(15, 60, 352, 270));
		
                getContentPane().add(scroller, BorderLayout.CENTER);

		setSize(1000,680);  
		setVisible(true);
	}
		
	public static void main (String [] arg) {			 
		
		Executa p = new Executa();
		p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}
}

O que pode ser?

ViniGodoy

nullpointer exception só pode ser uma única coisa: Você esqueceu de dar “new” em algum dos seus objetos e está tentando chamar um método dele. Por exemplo, onde você fez

tabela = new JTable();

?

Henrique_Moraes

Perfeito Vinigodoy, graças a sua ajuda consegui montar meu AbstractModel, segue o código abaixo, se você tiver mais dicas sobre o assunto, ficarei grato.vlw

import javax.swing.table.AbstractTableModel;  
import java.util.List;  
import java.util.ArrayList;
import javax.swing.table.TableModel;
import java.util.Collections;  

class  ContatoTableModel extends AbstractTableModel {
    
	
	private static final int COL_NOME = 0;
    private static final int COL_TELEFONE1 = 1;
	private static final int COL_TELEFONE2 = 2;
	private static final int COL_CELULAR = 3;
	
	private List<Contato> lista;


	
    public ContatoTableModel(List<Contato> lista) {
	   
		this.lista = lista;  
       
    }
 		
	public int getRowCount() {
		
        return lista.size();
    }

    public int getColumnCount() {
		
        return 4;
    }
	
	public String getColumnName(int column) {

        if (column == COL_NOME) return "Nome";
        if (column == COL_TELEFONE1) return "Telefone1";
		if (column == COL_TELEFONE2) return "Telefone2";
		if (column == COL_CELULAR) return "Celular";
        return ""; //Nunca deve ocorrer
    }

    public Object getValueAt(int row, int column) {

        Contato titulo = lista.get(row);
        if (column == COL_NOME) return titulo.getNome();
        else if (column == COL_TELEFONE1) return titulo.getTelefone1();
		else if (column == COL_TELEFONE2) return titulo.getTelefone2();
		else if (column == COL_CELULAR) return titulo.getCelular();
		throw new IllegalArgumentException("Invalid column");
        //return ""; //Nunca deve ocorrer  
		
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    
		Contato titulo = lista.get(rowIndex);
        if (columnIndex== COL_NOME) titulo.setNome(aValue.toString());
        else if (columnIndex== COL_TELEFONE1) titulo.setTelefone1(aValue.toString());
		else if (columnIndex== COL_TELEFONE2) titulo.setTelefone2(aValue.toString());
		else if (columnIndex== COL_CELULAR) titulo.setCelular(aValue.toString());
    }

	
	public Class<?> getColumnClass(int columnIndex) {  
		
        if (columnIndex == COL_NOME) {  
            return String.class;  
        } else if (columnIndex == COL_TELEFONE1) {  
            return String.class;  
        } else if (columnIndex == COL_TELEFONE2) {  
            return String.class;  
        } else if (columnIndex == COL_CELULAR) {  
            return String.class;  
        } else {  
			return String.class;  
        }  
    }
	

    public Contato get(int row) {
		
        return lista.get(row);
    }
}
ViniGodoy

Se seu getColumnClass sempre retorna um String, não era mais fácil deixa-lo assim?

@Override public Class<?> getColumnClass(int columnIndex) { return String.class; }

Outra coisa, é bem provável que sua classe de model deverá ser uma “public class”.

Criado 17 de junho de 2010
Ultima resposta 22 de jun. de 2010
Respostas 12
Participantes 3