[RESOLVIDO]Ajuda em Entender e implementar TableModel

Boa tarde amigos.

Estou tentando entender como faço para implementar a TableModel, então criei uma classe assim

package controler;
import java.util.*;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

import model.EstadoBean;
public class EstadoTableModel extends AbstractTableModel{
    public static final int COL_ID = 0;
    public static final int COL_UF = 1;
    public static final int COL_NOME = 2;
    private List<EstadoBean> listarEstados;
    public EstadoTableModel(List<EstadoBean> l){
        this.listarEstados = new ArrayList<EstadoBean>(l);
    }
    public int getRowCount(){
        return listarEstados.size();
    }
    public int getColumnCount(){
        return 3;
    }
    public Object getValueAt(int linhas, int colunas){
        EstadoBean estado  = this.listarEstados.get(linhas);
        if(colunas == COL_ID) return estado.getId();
        if(colunas == COL_UF) return estado.getUf();
        if(colunas == COL_NOME) return estado.getNome();
        return "";
    }
    public String getColumnName(int colunas){
        if(colunas == COL_ID) return "Id";
        if(colunas == COL_UF) return "Uf";
        if(colunas == COL_NOME) return "Nome";
        return "";
    }
    public EstadoBean get(int linhas){
        return listarEstados.get(linhas);
    }
}

ai na tela que tem a jtable eu coloquei assim pra preencher a tabela com os dados

import javax.swing.JLabel;

import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import java.awt.Font;

import model.EstadoBean;
import model.EstadoDao;

import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.awt.event.ActionEvent;
import javax.swing.JTable;

import controler.EstadoTableModel;

@SuppressWarnings("serial")
public class jPnl_Estado extends JPanel {
	private JTable tabela;
	EstadoTableModel modelo;
	
	public jPnl_Estado() {
	        
		try {
			modelo = new EstadoTableModel(EstadoDao.ListaEstado());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		tabela = new JTable(modelo);
		tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		tabela.setBounds(200, 62, 550, 500);
		
		JScrollPane rolagem = new JScrollPane();
		add(tabela);
	    initComponents();
	}
    private void initComponents() {
		setLayout(null);
		
		JLabel lblEstado = new JLabel("Cadastro de Estados");
		lblEstado.setFont(new Font("Tahoma", Font.BOLD, 12));
		lblEstado.setBounds(10, 11, 224, 14);
		add(lblEstado);
		
		JButton btnFechar = new JButton("Fechar");
		btnFechar.setBorder(null);
		btnFechar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Agenda.mnCadastro.setEnabled(true);
				Agenda.mnRelatorio.setEnabled(true);
				Agenda.mnAjuda.setEnabled(true);
				Agenda.cardLayout.show (Agenda.painelBase, "principal");
			}
		});
		btnFechar.setOpaque(false);
		btnFechar.setMnemonic('F');
		btnFechar.setBounds(10, 228, 108, 23);
		add(btnFechar);

		Toolkit tk = Toolkit.getDefaultToolkit();
	    Dimension d = tk.getScreenSize();
	    //Screen width  = d.width
	    //Screen height = d.height
		
		JSeparator separator = new JSeparator();
		separator.setBounds(1, 26, d.width, 1);
		add(separator);
		
		JButton btnNewButton = new JButton("Pesquisar");
		btnNewButton.setBorder(null);
		btnNewButton.setMnemonic('P');
		btnNewButton.setOpaque(false);
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
			}
		});
		btnNewButton.setBounds(10, 58, 108, 23);
		add(btnNewButton);
		
		JButton btnNewButton_1 = new JButton("Visualisar");
		btnNewButton_1.setBorder(null);
		btnNewButton_1.setOpaque(false);
		btnNewButton_1.setMnemonic('V');
		btnNewButton_1.setBounds(10, 92, 108, 23);
		add(btnNewButton_1);
		
		JButton btnNewButton_2 = new JButton("Incluir");
		btnNewButton_2.setBorder(null);
		btnNewButton_2.setOpaque(false);
		btnNewButton_2.setMnemonic('I');
		btnNewButton_2.setBounds(10, 126, 108, 23);
		add(btnNewButton_2);
		
		JButton btnNewButton_3 = new JButton("Alterar");
		btnNewButton_3.setBorder(null);
		btnNewButton_3.setMnemonic('A');
		btnNewButton_3.setOpaque(false);
		btnNewButton_3.setBounds(10, 160, 108, 23);
		add(btnNewButton_3);
		
		JButton btnNewButton_4 = new JButton("Excluir");
		btnNewButton_4.setBorder(null);
		btnNewButton_4.setOpaque(false);
		btnNewButton_4.setMnemonic('E');
		btnNewButton_4.setBounds(10, 194, 108, 23);
		add(btnNewButton_4);

    }
}

tela da table

Ele está trazendo os dados, porém, não sei como e onde implementar pra ele trazer também o cabeçalho, eu sei que na classe EstadoTableModel, eu alterei pro cabeçalho que tem minha tabela. porém não sei mais progredir, alguém poderia dar uma explicação. (não vou negar, tentei sim usar defaulttablemodel, mas quando fui procurar ajuda e muita gente falando mal dele, logo larguei e to quebrando a cabeça aki no TableModel).

Um muito obrigado.

Christian

Boa madrugada amigos. Estou até agora tentando resolver meu problema, achei um rumo para tentar resolver, eu utilizo um cardlayout que tem 3 jpanel nele, e este tablemodel está e um jpanel, porém ele não tem um jframe par eu poder utilizar este comando getContentPane().add(new JScrollPane(getTblEstado())); para poder aparecer o cabeçalho.


Venho humildemente perguntar, tem como eu colocar algo parecido disso em uma classe que se extende de um jpanel ?



desde já agradeço



Christian

Essa afirmação não faz sentido pois o TableModel não é um componente visual, ele apenas fornece dados para a JTable renderizar.

Acho que o problema da sua JTable não apresentar os cabeçalhos é porque você não está adicionando ela em um JScrollPane, veja como você implementou:

public jPnl_Estado() {
    try {
        modelo = new EstadoTableModel(EstadoDao.ListaEstado());
    } catch (SQLException e) {
        e.printStackTrace();
    }
    tabela = new JTable(modelo); // criou a JTable, OK
    tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    tabela.setBounds(200, 62, 550, 500);

    JScrollPane rolagem = new JScrollPane(); // criou um JScrollPane e não faz nada com ele
    add(tabela); // adicionou a JTable na tela
    initComponents();
}

Creio que você deveria ter feito assim:

public jPnl_Estado() {
    try {
        modelo = new EstadoTableModel(EstadoDao.ListaEstado());
        tabela = new JTable(modelo);
        tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        JScrollPane rolagem = new JScrollPane(tabela);
        add(rolagem);
        rolagem.setBounds(200, 62, 550, 500);

        initComponents();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

Evite usar o setBounds, ao invés disso utilize os gerenciadores de layout em conjunto com painéis aninhados.

1 curtida

mano que burro que sou, do jeito que voce me explicou foi tão simples que me senti um nenem.

Mas muito obrigado, ja testei e funcionou, então o que tenho que fazer é simplesmente passar a minha tabela como parametro pro jscrollpane, nem tinha me ligado.

Muito Obrigado

passei a noite rodando pelos links do forum procurando onde eu tinha errado LOL.

1 curtida