JTable Removendo colunas em tempo de execução

Sim, Livro é uma classe hipotética. Imagine que ela exista e foi implementada em algum lugar.

Ela é a classe que está sendo listada na tabela.

Pessoal, estou começando com jTables e minha aplicação ta cheia desses códigos espalhados:

 public void consulta(Table){
        Object[] dados = new Object[N];
        DefaultTableModel model = (DefaultTableModel)tableMedico.getModel();
        model.setNumRows(0);

        String sql = "CONSULTA SQL";

        try {
            ConexaoBD con = new ConexaoBD();
            PreparedStatement ps = con.conn.prepareStatement(sql);
            ResultSet resultado = ps.executeQuery();

            while(resultado.next()){

                dados[0] = resultado.getString(1);
                dados[1] = resultado.getString(2);
                dados[2] = resultado.getString(3);
                dados[3] = resultado.getString(4);
                dados[4] = resultado.getString(5);
                dados[5] = resultado.getString(6);
                dados[6] = resultado.getString(7);
                dados[6] = resultado.getString(....);

                int[] tamCol = new int[7];
                tamCol[0]  = 5;
                tamCol[1]  = 70;
                tamCol[2]  = 35;
                tamCol[3]  = 25;
                tamCol[4]  = 10;
                tamCol[5]  = 60;
                tamCol[6]  = 60;
                tamCol[6]  = ...................;

                for(int i=0; i < tableMedico.getColumnCount(); i++) {
                    TableColumn column = tableMedico.getColumnModel().getColumn(i);
                    column.setMinWidth(tamCol[i]);
                    column.setPreferredWidth(tamCol[i]);
                }

                // alinhamento
                DefaultTableCellRenderer esquerda = new DefaultTableCellRenderer();
                DefaultTableCellRenderer centralizado = new DefaultTableCellRenderer();
                DefaultTableCellRenderer direita = new DefaultTableCellRenderer();

                esquerda.setHorizontalAlignment(SwingConstants.LEFT);
                centralizado.setHorizontalAlignment(SwingConstants.CENTER);
                direita.setHorizontalAlignment(SwingConstants.RIGHT);

                tableMedico.getColumnModel().getColumn(0).setCellRenderer(esquerda);
                tableMedico.getColumnModel().getColumn(1).setCellRenderer(esquerda);

                model.addRow(dados);
            }
        } catch (SQLException ex) {
            Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

O que realmente eu acho PORCO!
Porém é a forma que eu estou achando mais simples…
Estou tentando entender o exemplo do Vinni, mas tá um pouco complicado, alguém teria um exemplo prático para me mandar e eu ver?Acho que ficaria mais fácil para entender!

Obrigado à todos.

Bom dia a todos!

ViniGodoi achei seu post procurando na net sobre JTable, e está me ajudando muito, parabéns pelo exemplo. Entretanto, estou com uma dúvida de como atualizar o Jtable pois tenho a seguinte situação:

Tenho um Jtable com os dados na tela principal, essa tela só mostra os dados, para adicionar ou editar dados eu clico num botão nessa tela e outra tela abre com os campos para edição ou criação de um novo registro. Bem, quando salvo o registro, preciso que o JTable da tela de trás seja atualizado.

Andei pesquisando sobre o padrão Observer, mas não estou conseguindo fazer o que preciso. Será que é possível vc postar um breve exemplo de como resolver esse problema da forma mais correta para o meu caso?

Abraço!

No seu caso não é necessário usar um Observer. Simplesmente abra um JDialog, e faça a comunicação entre as duas janelas através de passagem de parâmetros, como nesse exemploa aqui:
http://www.guj.com.br/posts/list/55710.java#292687

Desculpe não responder antes, estava com outras atividades…

Perfeito!!!

Acabei de fazer a modificação de acordo com o exemplo que vc passou e funcionou perfeitamente.

ViniGodoy obrigado pela ajuda! :smiley:

ViniGodoy, bom dia!

Agora estou com um problema que me deixou surpreso. Estou montando um jtable e nesse caso tenho que aplicar uma barra de rolagem horizontal, pois o tamanho dele não comporta
todas as colunas que preciso mostrar. O problema é que quando eu rolo a barra horizontal, o header fica desformatado nas colunas do final, como se não renderizasse corretamente, segue os fragmentos para melhor compreensão.

Esqueci de postar o fragmento de código da mensagem acima:

   try {
       DefaultTableCellRenderer rendererCentro = new DefaultTableCellRenderer();   
       rendererCentro.setHorizontalAlignment(SwingConstants.CENTER);   

       DefaultTableCellRenderer rendererDireita = new DefaultTableCellRenderer();   
       rendererDireita.setHorizontalAlignment(SwingConstants.RIGHT);   

       DefaultTableCellRenderer rendererEsquerda = new DefaultTableCellRenderer();   
       rendererEsquerda.setHorizontalAlignment(SwingConstants.LEFT);   

       [b]JTableHeader header = jTable.getTableHeader();   
       header.setPreferredSize(new Dimension(0, 35));
       
       jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
       jTable.setAutoscrolls(true);[/b]
       
       TableColumnModel modeloDaColuna = jTable.getColumnModel();

[quote=ViniGodoy]Só pra constar. Eu já fui clipeiro e admito que no começo dá muita dificuldade em entender os conceitos de OO e do Java. E, para ser bem sincero, o JTextField com formatação do Java não chega aos pés do existente no clipper.

O que você deve entender é que nos métodos do AbstractTableModel você estará dizendo ao JTable o que ela deve desenhar. Cada método, diz ao java uma coisa diferente.

Por exemplo. Considere que você vai escrever um TableModel para mostrar livros na tela, e quer exibir 2 colunas, uma para o autor (coluna 0) e outra para o título (coluna 1).

public class LivrosTableModel extends AbstractTableModel {
    private static final int COL_AUTOR = 0;
    private static final int COL_TITULO = 1;

    private List<Livro> valores;       

    //Esse é um construtor, que recebe a nossa lista de livros
    public TitulosTableModel(List<Livro> valores) {
          this.valores = new ArrayList<Livro>(valores);
    }

    public int getRowCount() {
        //Quantas linhas tem sua tabela? Uma para cada item da lista.
        return valores.size();
    }

    public int getColumnCount() {
        //Quantas colunas tem a tabela? Nesse exemplo, só 2.
        return 2;
    }

    public String getColumnName(int column) {
        //Qual é o nome das nossas colunas?
        if (column == COL_AUTOR) return "Autor";
        if (column == COL_TITULO) return "Título";
        return ""; //Nunca deve ocorrer
    }

    public Object getValueAt(int row, int column) {
        //Precisamos retornar o valor da coluna column e da linha row.
        Livro titulo = valores.get(row);
        if (column == COL_AUTOR) return titulo.getTitulo();
        else if (column == COL_TITULO) return titulo.getAutor().getNome();
        return ""; //Nunca deve ocorrer
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //Vamos alterar o valor da coluna columnIndex na linha rowIndex com o valor aValue passado no parâmetro.
        //Note que vc poderia alterar 2 campos ao invés de um só.
        if (columnIndex== COL_TITULO) titulo.setTitulo(aValue.toString());
        else if (columnIndex== COL_AUTOR) titulo.getAutor().setNome(aValue.toString());
    }

    public Class<?> getColumnClass(int columnIndex) {
        //Qual a classe das nossas colunas? Como estamos exibindo texto, é string.
        return String.class;
    }
    
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.
        return true;
    }
    //Já que esse tableModel é de livros, vamos fazer um get que retorne um livro inteiro.
    //Isso elimina a necessidade de chamar o getValueAt() nas telas. 
    public Livro get(int row) {
        return valores.get(row);
    }
}

Depois, para usar esse model vc só faz:
suaTable.setModel(new LivrosTableModel(listaDeLivros));

O que o Java faz na hora de desenhar a tabela? O objeto JTable:

  1. Chama os método getColumnsCount() e getRowsCount() para descobrir quantas linhas e colunas deve desenhar;
  2. Chama o método getColumnTitle() para saber que informações irá no título da tabela;
  3. Chama o método getValueAt para saber o que escrever dentro da célula
  4. Chama o método getColumnClass() para saber como desenhar a informação. Em células do tipo Boolean.class, aparecerá um checkbox, células do tipo Integer.class serão alinhadas a direita.
  5. E, também, chama o método isCellEditable para verificar se deve ou não habilitar o editor.

O que as vezes demora a cair a ficha é notar que seus métodos estão respondendo ao Java. Quem chamará um método como
public Object getValueAt(int row, int column) é o JTable, enquanto está se desenhando.
Ele que dirá "Ei, quero desenhar o objeto da linha 1, coluna 3, que valor você tem pra mim aí?"

Você vai notar, depois que aprender a usar o AbstractTableModel, que o trabalho que você tem hoje no Default é enorme. Parece ainda maior se você considerar a existência de modelos ainda mais automáticos, como o do Mark. O seu código atual também fica muito desorganizado. A escrita da tabela se mistura ao código da interface gráfica. Estendendo do abstract, tudo fica separadinho:
Desenho é com a JTable
Dados é com o model
Lógica da interface é na Tela.

Desculpe o tom provocativo do post anterior. A idéia era realmente te irritar. Nem que vc se motivasse novamente a aprender o model, só pra depois jogar na minha cara. :lol:

O esforço realmente vale a pena.[/quote]

Fiz esse exemplo do Vini, mas não consigo fazer mostrar o nome das Colunas quando mostra a tabela.
Alguém saberia dizer o que pode estar acontecendo, pq pelo que entendi o método getColumnName() é que adiciona o nome as colunas. E ele é chamado e os valores são retornados(vi pelo debug), mas quando aparece a tabela, aparece sem nome algum.

Você colocou sua tabela dentro de um JScrollPane? É necessário coloca-la para que o nome das colunas apareça.

Que rápido Vini :wink:

Hehe, não, coloquei em um JPanel.

Era isso mesmo, com JScrollPane funcionou.

Valeu Vini, muito boa essa dica. Realmente DefaultTableModel é bem mais chato de trabalhar.

O mais engraçado é que foi rápido e coincidência. Eu cheguei em casa, olhei os e-mails e a primeira mensagem era a desse tópico.


Bom, sei que é uma duvida meio tosca, mas é que eu to passando meio mal pra pegar a implementação de um modelo próprio pra tabela.
Até que peguei com DefaultTableModel mais realmente o código fica meio confuso. 
Se alguém puder só explicar melhor como ficaria um exemplo dessa clase <Livro>  
É que eu to tendo alguns erros quando tento fazer a minha tabela aqui.  :?
Agradeço desde já !

Bom, sei que é uma duvida meio tosca, mas é que eu to passando meio mal pra pegar a implementação de um modelo próprio pra tabela.
Até que peguei com DefaultTableModel mais realmente o código fica meio confuso.
Se alguém puder só explicar melhor como ficaria um exemplo dessa clase
É que eu to tendo alguns erros quando tento fazer a minha tabela aqui. :?
Agradeço desde já !

[code]public final class Livro {
private String titulo;
private Autor autor;

public Livro(String titulo, Autor autor) {
setTitulo(titulo);
setAutor(autor);
}

public void setTitulo(String titulo) {
if (titulo == null)
throw new IllegalArgumentException(“O título não pode ser nulo!”);

this.titulo = titulo.trim();

}

public String getTitulo() {
return titulo;
}

public void setAutor(Autor autor) {
if (autor == null)
throw new IllegalArgumentException(“O autor não pode ser nulo!”);
this.autor = autor;
}

public Autor getAutor() {
return autor;
}
}
[/code]

E a classe Autor:

public final class Autor {
    private String nome;
    private String descricao;

    public Autor(String nome, String descricao) {
       setNome(nome);
       setDescricao(descricao);
    }

    public void setNome(String nome) {
        if (nome == null)
            throw new IllegalArgumentException("O nome não pode ser nulo!");
        this.nome = nome.trim();
    }   

    public void getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        if (descricao == null)
            throw new IllegalArgumentException("A descricao não pode ser nula!");
        this.descricao = descricao.trim();
    }   

    public void getNome() {
        return nome;
    }
}

Pooooow brigadão cara ! _
Era isso msm que queria !

Tudo pela morte do DefaultTableModel.

1 curtida

Oi VinnyGodoy.

Eu sou novo em Java e estou tentando usar o AbstractTableModel.

Atualmente eu consigo obter o objeto se eu clicar duas vezes, porém, se eu reorganizo a tabela clicando em uma coluna, e clico duas vezes novamente ele me retorna o primeiro item de quando eu não tinha reorganizado.

Esta aqui é minha AbstractTableModel:

public class AlunoTableModel extends AbstractTableModel {
	
    private static final long serialVersionUID = 1L;
	
    private static final int COL_nome_aluno = 0;
    private static final int COL_endereco_aluno = 1;
    private static final int COL_tel_aluno = 2;
    private static final int COL_cel_aluno = 3;
    private static final int COL_atestado_aluno = 4;
    private static final int COL_dtNasc_aluno = 5;
    private static final int COL_dtDePgto_aluno = 6;
    private static final int COL_planoPagamento = 7;

    private List&lt;Aluno&gt; alunos;
  
    public AlunoTableModel(List&lt;Aluno&gt; _alunos) {
          this.alunos = new ArrayList&lt;Aluno&gt;(_alunos);
    }

    public int getRowCount() {  
        return alunos.size();  
    }  
  
    public int getColumnCount() {  
        return 8;
    }  
  
    public String getColumnName(int column) {  
        if (column == COL_nome_aluno) return &quot;Nome&quot;;
        if (column == COL_endereco_aluno) return &quot;Endereço&quot;;
        if (column == COL_tel_aluno) return &quot;Telefone&quot;;
        if (column == COL_cel_aluno) return &quot;Celular&quot;;
        if (column == COL_atestado_aluno) return &quot;Atestado&quot;;
        if (column == COL_dtNasc_aluno) return &quot;Data de Nascimento&quot;;
        if (column == COL_dtDePgto_aluno) return &quot;Dia de Pagamento&quot;;
        if (column == COL_planoPagamento) return &quot;Plano de Pagamento&quot;;
        return &quot;&quot;;
    }  
  
    public Object getValueAt(int row, int column) {  
        Aluno aluno = alunos.get(row);
        if (column == COL_nome_aluno) return aluno.getNome_aluno();
        else if (column == COL_endereco_aluno) return aluno.getEndereco_aluno();
        else if (column == COL_tel_aluno) return aluno.getTel_aluno();
        else if (column == COL_cel_aluno) return aluno.getCel_aluno();
        else if (column == COL_atestado_aluno) return aluno.isAtestado_aluno();
        else if (column == COL_dtNasc_aluno) {
			SimpleDateFormat f = new SimpleDateFormat(&quot;yyyy-MM-dd&quot;);    
			Date d1 = null;
			
			try {    
			    d1 = f.parse(aluno.getDtNasc_aluno().toString());                
			} catch (Exception e) {    
			    e.printStackTrace();    
			}    
			    
			SimpleDateFormat format = new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);    
			    
			return format.format(d1);
        }
        else if (column == COL_dtDePgto_aluno) return aluno.getDtDePgto_aluno();
        else if (column == COL_planoPagamento) return aluno.getPlanoPagamento();
        throw new IllegalArgumentException(&quot;Coluna Inválida&quot;);
    }  
  
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {  
    	Aluno aluno = new Aluno();
		DateFormat format = new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);
    	
        if (columnIndex == COL_nome_aluno)
        	aluno.setNome_aluno(aValue.toString());  
        else if (columnIndex == COL_endereco_aluno)
        	aluno.setEndereco_aluno(aValue.toString());
        else if (columnIndex == COL_tel_aluno) 
        	aluno.setTel_aluno(aValue.toString());
        else if (columnIndex == COL_cel_aluno) 
        	aluno.setCel_aluno(aValue.toString());
        else if (columnIndex == COL_dtNasc_aluno)
			try {
				aluno.setDtNasc_aluno(format.parse(aValue.toString()));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		else if (columnIndex == COL_dtDePgto_aluno) 
        	aluno.setDtDePgto_aluno(Integer.parseInt(aValue.toString()));
        else if (columnIndex == COL_planoPagamento) 
        	aluno.setPlanoPagamento(aValue.toString());
    }
  
    public Class&lt;?&gt; getColumnClass(int columnIndex) {  
    	if (columnIndex == 4)
    		return Boolean.class;
    	if (columnIndex == 6)
    		return Integer.class;
        return String.class;  
    }  
      
    public boolean isCellEditable(int rowIndex, int columnIndex) {  
        return false;
    }  
    
    public Aluno get(int row) {  
        return alunos.get(row);  
    }
}

Pra obter o objeto eu usei o método abaixo:

    public Aluno getAlunoDaLinhaSelecionada(List&lt;Aluno&gt; alunosList) {
    	if (table.getSelectedRow() == -1)
    		return null;
    	
    	return alunosList.get(table.getSelectedRow());
    }

e aqui está o evento do duplo clique:

		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if (arg0.getClickCount() == 2) {
					Aluno aluno = VPesquisarAluno.this.getAlunoDaLinhaSelecionada(TodosAlunos);
					
					if (pesquisar == true) {
						VAluno vAluno = new VAluno(false, true, true, true, aluno);
						vAluno.setVisible(true);
						vAluno.setLocationRelativeTo(null);
					} else if (alterar == true) {
						VAluno vAluno = new VAluno(false, true, false, false, aluno);
						vAluno.setVisible(true);
						vAluno.setLocationRelativeTo(null);
					} else if (excluir == true) {
						VAluno vAluno = new VAluno(false, false, true, false, aluno);
						vAluno.setVisible(true);
						vAluno.setLocationRelativeTo(null);
					} else if (pgto == true) {
						VPgto vPgto = new VPgto();
						vPgto.setVisible(true);
						vPgto.setLocationRelativeTo(null);
					}
		        }
			}
		});

se puder ajudar, ou ao menos responder, agradeço desde já.

Consegui encontrar este post (do próprio ViniGodoy) sobre meu problema.

[quote=ViniGodoy]int viewIndex = jTable1.getSelectedRow(); //índice do que está sendo exibido na tabela int modelIndex = jTable1.convertRowIndexToModel(viewIndex); //Índice do conteúdo dentro do model Cliente c = listCliente.get(modelIndex);

Por essas e outras, é bom ler o javadoc. E também os Tutoriais, e não programar por tentativa e erro.

E claro, [color=red]não usar o DefaultTableModel.[/color][/quote]

Segue a resolução caso mais alguém precise:

	public Aluno getAlunoDaLinhaSelecionada() {  
		if (table.getSelectedRow() == -1)
			return null;

		int viewIndex = table.getSelectedRow(); //índice do que está sendo exibido na tabela  
		int modelIndex = table.convertRowIndexToModel(viewIndex); //Índice do conteúdo dentro do model  
		
		return TodosAlunos.get(modelIndex);
	}

suaTable.setModel(new LivrosTableModel(listaDeLivros));
nesta linha a "listaDeLivros " seria oque ?? que vc esta passando para a tabela??

[quote=souza_lucas]suaTable.setModel(new LivrosTableModel(listaDeLivros));
nesta linha a "listaDeLivros " seria oque ?? que vc esta passando para a tabela??[/quote]

Um List, contendo os livros que você quer que sejam carregados na sua tabela.
Provavelmente essa lista teria sido carregada do seu DAO.

boa noite… sei que o tópico é antigo mas a pergunta é pertinente ao assunto…

fiz todo codigo aqui… sem erros no depurador…

mas não to entendendo justamente o método para alterar a jTable dentro do jPanel

o que vai dentro da nova instancia MontadoraTableModel ??

onde coloco esse codigo no jPanel? logo apos o initComponents()?

public MontadoraForm() { initComponents();

só ta faltando isso pra eu botar esse treco pra rodar… e não usar o DefaultTableModel que até funcinou de primeira… mas por recomendação to querendo evitar de usar

segue a classe de entidade de banco de dados:

package oficina;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author Andre
 */
@Entity
@Table(name = "MONTADORA")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Montadora_DB.findAll", query = "SELECT m FROM Montadora_DB m"),
    @NamedQuery(name = "Montadora_DB.findById", query = "SELECT m FROM Montadora_DB m WHERE m.id = :id"),
    @NamedQuery(name = "Montadora_DB.findByMarca", query = "SELECT m FROM Montadora_DB m WHERE m.marca = :marca"),
    @NamedQuery(name = "Montadora_DB.findByService", query = "SELECT m FROM Montadora_DB m WHERE m.service = :service"),
    @NamedQuery(name = "Montadora_DB.findByUsuario", query = "SELECT m FROM Montadora_DB m WHERE m.usuario = :usuario"),
    @NamedQuery(name = "Montadora_DB.findBySenha", query = "SELECT m FROM Montadora_DB m WHERE m.senha = :senha"),
    @NamedQuery(name = "Montadora_DB.findByTel", query = "SELECT m FROM Montadora_DB m WHERE m.tel = :tel"),
    @NamedQuery(name = "Montadora_DB.findByLixo", query = "SELECT m FROM Montadora_DB m WHERE m.lixo = :lixo")})
public class Montadora_DB implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "MARCA")
    private String marca;
    @Column(name = "SERVICE")
    private String service;
    @Column(name = "USUARIO")
    private String usuario;
    @Column(name = "SENHA")
    private String senha;
    @Column(name = "TEL")
    private String tel;
    @Basic(optional = false)
    @Column(name = "LIXO")
    private short lixo;

    public Montadora_DB() {
    }

    public Montadora_DB(Integer id) {
        this.id = id;
    }

    public Montadora_DB(Integer id, String marca, short lixo) {
        this.id = id;
        this.marca = marca;
        this.lixo = lixo;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getService() {
        return service;
    }

    public void setService(String service) {
        this.service = service;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public short getLixo() {
        return lixo;
    }

    public void setLixo(short lixo) {
        this.lixo = lixo;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Montadora_DB)) {
            return false;
        }
        Montadora_DB other = (Montadora_DB) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "oficina.Montadora_DB[ id=" + id + " ]";
    }
    
}

segue a classe MontadoraTableModel

package oficina;

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

/**
 *
 * @author Andre
 */
public class MontadoraTableModel extends AbstractTableModel {

    private static final int NOME = 0;
    private static final int TELEFONE = 1;
    private static final int SERVICE = 2;
    private static final int USUARIO = 3;
    private static final int SENHA = 4;
    private static final int ID = 5;
    private static final int LIXO = 6;

    private List<Montadora_DB> montadora;

    //Esse é um construtor, que recebe a nossa lista de livros  
    public void MontadoraTableModel(List<Montadora_DB> _montadora) {
        this.montadora = new ArrayList<Montadora_DB>(_montadora);
    }

    public int getRowCount() {
        //Quantas linhas tem sua tabela? Uma para cada item da lista.  
        return montadora.size();
    }

    public int getColumnCount() {
        //Quantas colunas tem a tabela? Nesse exemplo, só 2.  
        return 7;
    }

    public String getColumnName(int column) {
        //Qual é o nome das nossas colunas?  
        switch (column) {
            case NOME:
                return "MONTADORA";
            case TELEFONE:
                return "TELEFONE";
            case SERVICE:
                return "SERVICE";
            case USUARIO:
                return "USUARIO";
            case SENHA:
                return "SENHA";
            case ID:
                return "ID";
            case LIXO:
                return "LIXO";
        }
        /*
         if (column == NOME) {
         return "MONTADORA";
         }
         if (column == TELEFONE) {
         return "TELEFONE";
         }
         if (column == SERVICE) {
         return "TELEFONE";
         }
         if (column == USUARIO) {
         return "USUARIO";
         }
         if (column == SENHA) {
         return "SENHA";
         }
         return ""; //Nunca deve ocorrer  */
        throw new IllegalArgumentException("GetColumnName Inválido!");
    }

    public Object getValueAt(int row, int column) {
        //Precisamos retornar o valor da coluna column e da linha row.  
        Montadora_DB montadora = this.montadora.get(row);

        /*switch (column) {
         case NOME:
         return montadora.getMarca();            
         case TELEFONE:
         return montadora.getTel();             
         case SERVICE:
         return montadora.getService();              
         case USUARIO:
         return montadora.getUsuario();
         case SENHA:
         return montadora.getSenha(); 
         case ID:
         return montadora.getId();
         case LIXO:
         return montadora.getLixo();
         }
         */
        if (column == NOME) {
            return montadora.getMarca();
        } else if (column == TELEFONE) {
            return montadora.getTel();
        } else if (column == SERVICE) {
            return montadora.getService();
        } else if (column == USUARIO) {
            return montadora.getUsuario();
        } else if (column == SENHA) {
            return montadora.getSenha();
        } else if (column == ID) {
            return montadora.getId();
        } else if (column == LIXO) {
            return montadora.getLixo();
        }
        //return ""; //Nunca deve ocorrer  
        throw new IllegalArgumentException("Coluna Inválida");
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Montadora_DB montadora = this.montadora.get(rowIndex);
        //Vamos alterar o valor da coluna columnIndex na linha rowIndex com o valor aValue passado no parâmetro.  
        //Note que vc poderia alterar 2 campos ao invés de um só.  
        if (columnIndex == NOME) {
            montadora.setMarca(aValue.toString());
        } else if (columnIndex == TELEFONE) {
            montadora.setTel(aValue.toString());
        } else if (columnIndex == SERVICE) {
            montadora.setService(aValue.toString());
        } else if (columnIndex == USUARIO) {
            montadora.setUsuario(aValue.toString());
        } else if (columnIndex == SENHA) {
            montadora.setSenha(aValue.toString());
        } //else if (columnIndex == ID) {
          //  montadora.setId(aValue.toString());
        //} else if (columnIndex == LIXO) {
        //    montadora.setLixo(aValue.toString());
        //}
        
        /*switch (columnIndex) {
         case NOME:
         montadora.setMarca(aValue.toString());
         case TELEFONE:
         montadora.setTel(aValue.toString());
         case SERVICE:
         montadora.setService(aValue.toString());
         case USUARIO:
         montadora.setUsuario(aValue.toString());
         case SENHA:
         montadora.setSenha(aValue.toString());
         case ID:
         //montadora.setId(aValue.toString());
         case LIXO:
         //montadora.setLixo(aValue.toString());

         }*/
        throw new IllegalArgumentException("Coluna Inválida");

    }

    public Class<?> getColumnClass(int columnIndex) {
        //Qual a classe das nossas colunas? Como estamos exibindo texto, é string.  
        /*switch (columnIndex) {
            case 5:
                return Integer.class;
            case 6:
                return Short.class;
        }*/
        return String.class;
    }

    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.  
        return true;
    }

    //Já que esse tableModel é de livros, vamos fazer um get que retorne um livro inteiro.  
    //Isso elimina a necessidade de chamar o getValueAt() nas telas.   
    public Montadora_DB get(int row) {
        return montadora.get(row);
    }
}