Fala, pessoal.
Tava quebrando a cabeça aqui pra ajeitar o JTable e agora consegui fazer o básico funcionar.
Mas ainda tem uns erros:
1. Quando já existe um objeto na tabela e eu adiciono outro, os dados na tabela do objeto que estava lá são substituídos pelos dados do novo objeto.[Resolvido]
2. Quando eu clico remover sem selecionar nenhum objeto na tabela o último objeto é removido. Eu quero que só possa ser removido quando for selecionado com clique e os dados do objeto (vindos da tabela, que vêm do banco) já estejam nos campos.[Resolvido]
3. Quero que a JTable seja só pra visualização rápida e pra seleção de clientes cadastrados. E ao clicar numa linha da JTable os JTextFields serão preenchidos com os dados completos do objeto. [Não implementado, ainda. É só usar o get do ClientesTableModel][Resolvido]
ClientesTableModel (baseado nesse exemplo: http://www.guj.com.br/java/132698-jtable-removendo-colunas-em-tempo-de-execucao#714736):
[code]package visao;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import modelo.Cliente;
public class ClientesTableModel<T> extends AbstractTableModel {
//Nome das colunas
private static final int COL_NOME = 0;
private static final int COL_CIDADE = 1;
private static final int COL_EMAIL = 2;
private static final int COL_TELEFONE = 3;
//Lista dos clientes que serão exibidos.
private List<Cliente> clientes;
public ClientesTableModel(){
this.clientes = new ArrayList<Cliente>();
}
//Construtor que recebe a lista de clientes
public ClientesTableModel(List<Cliente> lista) {
this();
this.clientes.addAll(lista);
}
public int getRowCount() {
//Retorna o número de linhas da tabela. Uma linha para cada item na lista de clientes.
return clientes.size();
}
public int getColumnCount() {
//Retorna o números de colunas da tabela. Nesse caso, 4.
return 4;
}
public String getColumnName(int columnIndex) {
//Qual é o nome das nossas colunas?
//String colunas[] = {"Nome", "Cidade", "E-mail", "Telefone"};
if (columnIndex == COL_NOME) return "Nome";
if (columnIndex == COL_CIDADE) return "Cidade";
if (columnIndex == COL_EMAIL) return "E-mail";
if (columnIndex == COL_TELEFONE) return "Telefone";
return ""; //Nunca deve ocorrer
//return colunas[columnIndex];
}
public Class<?> getColumnClass(int columnIndex) {
//Qual a classe das nossas colunas?
/*Como nesse caso só serão exibidas colunas String, não é necessário fazer a checagem.
if (columnIndex == COL_NOME) return String.class;
else if (columnIndex == COL_CIDADE) return String.class;
else if (columnIndex == COL_EMAIL) return String.class;
else if (columnIndex == COL_TELEFONE) return String.class;*/
//return null; //Nunca deve acontecer
return String.class;
}
public Object getValueAt(int row, int column) {
//Precisamos retornar o valor da coluna column e da linha row.
Cliente cliente = clientes.get(row);
if (column == COL_NOME) return cliente.getNome();
else if (column == COL_CIDADE) return cliente.getCEP();
else if (column == COL_EMAIL) return cliente.getEmail();
else if (column == COL_TELEFONE) return cliente.getTel();
return ""; //Nunca deve ocorrer
}
@Override
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.
Cliente cliente = clientes.get(rowIndex);
if (columnIndex== COL_NOME) cliente.setNome(aValue.toString());
else if (columnIndex== COL_CIDADE) cliente.setCidade(aValue.toString());
else if (columnIndex== COL_EMAIL) cliente.setEmail(aValue.toString());
else if (columnIndex== COL_TELEFONE) cliente.setTel(aValue.toString());
//Avisa que os dados mudaram
fireTableDataChanged();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
//Indicamos se a célula da rowIndex e da columnIndex é editável.
return false;
}
public List<Cliente> getClientes() {
return Collections.unmodifiableList(clientes);
}
//Insere um novo objeto na tabela.
public void inserir(Cliente cliente) {
clientes.add(cliente); //Adicionamos na lista
fireTableDataChanged(); //Redesenha o modelo.
}
//Remove um objeto da tabela.
public void remover(Cliente cliente) {
int index = clientes.indexOf(cliente);
if (index == -1) //Se o cliente não estiver na tabela
return; //Saimos sem fazer nada
clientes.remove(index); //Caso contrário, removemos da lista
fireTableDataChanged(); //Repintamos a linha
}
//Já que esse tableModel é de clientes, vamos fazer um get que retorne um cliente inteiro.
//Isso elimina a necessidade de chamar o getValueAt() nas telas.
public Cliente get(int row) {
return clientes.get(row);
}
public Cliente getCliente(int pos){
if (pos < 0 || pos >= clientes.size())
return null;
return clientes.get(pos);
}
} [/code]
TelaCliente:
[code]/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
/*
- TelaCliente.java
- Created on 01/07/2011, 14:39:40
*/
package visao;
import java.awt.Component;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import modelo.Cliente;
import visao.ClientesTableModel;
public class TelaCliente extends javax.swing.JDialog {
/** Creates new form TelaCliente */
public TelaCliente(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
this.jTableClientes.setModel(new ClientesTableModel());
}
private ClientesTableModel tableModelCliente(List<Cliente> clientes){
return new ClientesTableModel(clientes);
}
public void adicionaItemTabela(Cliente c){
pegaModelo().inserir(c);
}
public void removeItemTabela(Cliente c){
pegaModelo().remover(c);
}
public ClientesTableModel pegaModelo(){
return (ClientesTableModel)this.jTableClientes.getModel();
}
private Cliente getClienteDaLinhaSelecionada() {
if (this.jTableClientes.getSelectedRow() == -1) {
return null;
}
Cliente u = (Cliente) pegaModelo().getClientes().get(this.jTableClientes.getSelectedRow());
}
public void clearFields() {
Component[] componentes = this.getContentPane().getComponents();
for (int i = 0; i < componentes.length; i++) {
if (componentes[i] instanceof JTextField) {
JTextField field = (JTextField)componentes[i];
field.setText("");
}
}
}
public void escuta(ActionListener e){
this.jButtonAlterar.addActionListener(e);
this.jButtonCadastrar.addActionListener(e);
this.jButtonExcluir.addActionListener(e);
}
//...
[/code]