Olá amigos estou com um problema, estou tentando trabalhar com o AbstractTableModel, estou achando ótimo diante do horrível DefaultTableModel,
eu consigo listar os dados no TableModel mas a questão de alteração direto na linha( celula por celula) já nao consigo fazer, ja olhei os exemplos do forum
mas ainda nao consegui, gostaria que elaborar todos os passos que o TableModel nos oferece, como edição, exclusão, inserção e etc…
segue meus códigos…
/*Meu model*/
/*Entidade bov_piquete responsavel pelo modelo do objeto piquete*/
import java.sql.Date;
public class Bov_piquete {
private int id;
private String nome;
private double tamanho;
private int capacidade_bov;
private int capacidade_dias;
private String situacao;
private Date dt_cadastro;
private Date dt_alteracao;
/**
*
*/
public Bov_piquete() {
super();
// TODO Auto-generated constructor stub
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public double getTamanho() {
return tamanho;
}
public void setTamanho(double tamanho) {
this.tamanho = tamanho;
}
public int getCapacidade_bov() {
return capacidade_bov;
}
public void setCapacidade_bov(int capacidade_bov) {
this.capacidade_bov = capacidade_bov;
}
public int getCapacidade_dias() {
return capacidade_dias;
}
public void setCapacidade_dias(int capacidade_dias) {
this.capacidade_dias = capacidade_dias;
}
public String getSituacao() {
return situacao;
}
public void setSituacao(String situacao) {
this.situacao = situacao;
}
public Date getDt_cadastro() {
return dt_cadastro;
}
public void setDt_cadastro(Date dt_cadastro) {
this.dt_cadastro = dt_cadastro;
}
public Date getDt_alteracao() {
return dt_alteracao;
}
public void setDt_alteracao(Date dt_alteracao) {
this.dt_alteracao = dt_alteracao;
}
}
/*Minha tablemodel - */
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import br.com.freedom.model.Bov_piquete;
public class Bov_piquete_TableModel extends AbstractTableModel{
private List<Bov_piquete> linhas;
private static final String[] colunas = new String[]{"<html><b><i>Nome</i></b></html>",
"<html><b><i>Tamanho</i></b></html>",
"<html><b><i>Cap. bovinos</i></b></html>",
"<html><b><i>Cap. dias</i></b></html>",
"<html><b><i>Situação</i></b></html>"};
/*Cria um Bov_piquete_TableModel vazio */
public Bov_piquete_TableModel() {
linhas = new ArrayList<Bov_piquete>();
this.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent tme) {
int linha = tme.getFirstRow();
Bov_piquete p = new Bov_piquete();
JOptionPane.showMessageDialog(null, "ola");
// aqui você atualiza no banco ou em outro lugar qualquer
}
} );
}
// /*Cria um Bov_piquete_TableModel com a lista de piquetes especifidas*/
public Bov_piquete_TableModel(List<Bov_piquete> lista_piquetes){
linhas = new ArrayList<Bov_piquete>(lista_piquetes);
}
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return colunas.length;
}
@Override
public int getRowCount() {
// TODO Auto-generated method stub
return linhas.size();
}
/* Retorna o nome da coluna no índice especificado.
* Este método é usado pela JTable para saber o texto do cabeçalho. */
@Override
public String getColumnName(int columnIndex) {
// Retorna o conteúdo do Array que possui o nome das colunas
// no índice especificado.
return colunas[columnIndex];
};
/* Retorna a classe dos elementos da coluna especificada.
* Este método é usado pela JTable na hora de definir o editor da célula. */
@Override
public Class<?> getColumnClass(int columnIndex) {
// Retorna a classe referente a coluna especificada.
// Aqui é feito um switch para verificar qual é a coluna
// e retornar o tipo adequado. As colunas são as mesmas
// que foram especificadas no array "colunas".
switch (columnIndex) {
case 0: // Primeira coluna é o id, que é uma Integer.
return String.class;
case 1: // Segunda coluna é o idcontador, que também é um Contador..
return Double.class;
case 2: // Terceira coluna é tipo_atividade.
return Integer.class;
case 3: // Quarta coluna tipo pessoa - String.
return Integer.class;
case 4: // Quarta coluna tipo pessoa - String.
return String.class;
default:
// Se o índice da coluna não for válido, lança um
// IndexOutOfBoundsException (Exceção de índice fora dos limites).
// Não foi necessário verificar se o índice da linha é inválido,
// pois o próprio ArrayList lança a exceção caso seja inválido.
throw new IndexOutOfBoundsException("Coluna nao encontrada");
}
}
/* Retorna o valor da célula especificada
* pelos índices da linha e da coluna. */
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
// Pega o sócio da linha especificada.
Bov_piquete piquete = linhas.get(rowIndex);
// Retorna o campo referente a coluna especificada.
// Aqui é feito um switch para verificar qual é a coluna
// e retornar o campo adequado. As colunas são as mesmas
// que foram especificadas no array "colunas".
switch (columnIndex) {
case 0: // Primeira coluna é o id, que é uma Integer.
return piquete.getNome();
case 1: // Segunda coluna é o idcontador, que também é um Contador..
return piquete.getTamanho();
case 2: // Terceira coluna é tipo_atividade.
return piquete.getCapacidade_bov();
case 3: // Quarta coluna tipo pessoa - String.
return piquete.getCapacidade_dias();
case 4: // Quinta coluna tipo_empresa - String.
return piquete.getSituacao();
default:
// Se o índice da coluna não for válido, lança um
// IndexOutOfBoundsException (Exceção de índice fora dos limites).
// Não foi necessário verificar se o índice da linha é inválido,
// pois o próprio ArrayList lança a exceção caso seja inválido.
throw new IndexOutOfBoundsException("coluna index nao encontrada");
}
}
/* Seta o valor da célula especificada
* pelos índices da linha e da coluna.
* Aqui ele está implementado para não fazer nada,
* até porque este table model não é editável. */
public void setValueAt(Object value, int row, int col){
}
/* Retorna um valor booleano que define se a célula em questão
* pode ser editada ou não.
* Este método é utilizado pela JTable na hora de definir o editor da célula.
* Neste caso, estará sempre retornando false, não permitindo que nenhuma
* célula seja editada. */
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
////////////////////////////////////////////////////////////
// Os métodos declarados até aqui foram as implementações //
// de TableModel, que são continuamente utilizados //
// pela JTable para definir seu comportamento, //
// por isso o nome Table Model (Modelo da Tabela). //
// //
// A partir de agora, os métodos criados serão //
// particulares desta classe. Eles serão úteis //
// em algumas situações. //
////////////////////////////////////////////////////////////
/* Retorna a empresa da linha especificada. */
public Bov_piquete getPiquete(int indiceLinha) {
return linhas.get(indiceLinha);
}
/* Adiciona um registro. */
public void addPiquete(Bov_piquete piquete) {
this.linhas.add(piquete);
this.fireTableDataChanged();
}
/* Remove a linha especificada. */
public void removePiquete(int indiceLinha) {
linhas.remove(indiceLinha);
this.fireTableRowsDeleted(indiceLinha, indiceLinha);
}
// public void addPiquete(Bov_piquete p){
// linhas.add(p);
// int ultimoIndice = getRowCount()-1;
// this.fireTableRowsInserted(ultimoIndice, ultimoIndice);
//
// }
/* Adiciona uma lista de sócios ao final dos registros. */
public void addListaDeUfs(List<Bov_piquete> piquetes) {
// Pega o tamanho antigo da tabela.
int tamanhoAntigo = getRowCount();
// Adiciona os registros.
linhas.addAll(piquetes);
// Reporta a mudança. O JTable recebe a notificação
// e se redesenha permitindo que visualizemos a atualização.
fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
}
/* Remove todos os registros. */
public void limpar() {
// Remove todos os elementos da lista de sócios.
linhas.clear();
// Reporta a mudança. O JTable recebe a notificação
// e se redesenha permitindo que visualizemos a atualização.
fireTableDataChanged();
}
/* Verifica se este table model está vazio. */
public boolean isEmpty() {
return linhas.isEmpty();
}
public void atualizar(int row, Bov_piquete piquete){
linhas.set(row, piquete);
this.fireTableRowsUpdated(row, row);
}
public void notifyUpdated(Bov_piquete bv) {
int index = linhas.indexOf(bv);
bv = getPiquete(index);
fireTableRowsUpdated(index, index);
}
}
/*Minha view*/
import java.awt.BorderLayout;
public class View_Lista_Piquetes extends JDialog {
private JTable tblPiquetes;
private Bov_piquete_TableModel model;
private final JPanel contentPanel = new JPanel();
private JPanel panelTable = new JPanel();
private JTextField txtBuscarPiquete;
private final JButton btnNovo = new JButton("");
Bov_piquete_dao dao = new Bov_piquete_dao();
Bov_piquete piquete = new Bov_piquete();
/**
* Launch the application.
*/
public static void main(String[] args) {
try {
View_Lista_Piquetes dialog = new View_Lista_Piquetes();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the dialog.
*/
public View_Lista_Piquetes() {
setIconImage(Toolkit.getDefaultToolkit().getImage(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btAtendimentos.png")));
setTitle("Lista de piquetes");
setBounds(100, 100, 725, 442);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
contentPanel.setLayout(new BorderLayout(0, 0));
listarPiquetes("");
{
JPanel panelBusca = new JPanel();
panelBusca.setBackground(Color.WHITE);
contentPanel.add(panelBusca, BorderLayout.NORTH);
panelBusca.setLayout(new MigLayout("", "[91px][grow]", "[14px]"));
JLabel lblNomeDoPiquete = new JLabel("Nome do piquete : ");
lblNomeDoPiquete.setHorizontalAlignment(SwingConstants.CENTER);
panelBusca.add(lblNomeDoPiquete, "cell 0 0,alignx trailing,aligny center");
txtBuscarPiquete = new JTextField();
txtBuscarPiquete.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent arg0) {
listarPiquetes(txtBuscarPiquete.getText().toString());
}
});
panelBusca.add(txtBuscarPiquete, "cell 1 0,growx");
panelBusca.setBorder(new MatteBorder(2, 2, 2, 2, (Color) Color.BLACK));
txtBuscarPiquete.setColumns(10);
txtBuscarPiquete.setBorder(new MatteBorder(1, 1, 1, 1, (Color) Color.BLACK));
}
{
panelTable = new JPanel();
contentPanel.add(panelTable, BorderLayout.CENTER);
panelTable.setBorder(new MatteBorder(2, 2, 2, 2, (Color) Color.BLACK));
panelTable.setLayout(new GridLayout(0, 1, 0, 0));
JScrollPane scrollPane = new JScrollPane(getTblPiquetes());
panelTable.add(scrollPane);
}
{
JPanel buttonPane = new JPanel();
buttonPane.setBorder(new EtchedBorder(EtchedBorder.RAISED, Color.BLACK, null));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
buttonPane.setLayout(new GridLayout(0, 10, 0, 0));
btnNovo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
listarPiquetes("");
}
});
btnNovo.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btNovo.png")));
buttonPane.add(btnNovo);
btnNovo.setToolTipText("<html><i>Inserir novo registro</i></html>");
btnNovo.setActionCommand("OK");
{
JButton btnSalvar = new JButton("");
btnSalvar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
atualizar();
}
});
btnSalvar.setToolTipText("<html><i>Salvar altera\u00E7\u00F5es</i></html>");
btnSalvar.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btSalvar-old.png")));
btnSalvar.setActionCommand("OK");
buttonPane.add(btnSalvar);
getRootPane().setDefaultButton(btnSalvar);
}
{
JButton btnFormCadastro = new JButton("");
btnFormCadastro.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
View_Cadastro_Piquete cad_piquete = new View_Cadastro_Piquete();
cad_piquete.setModal(true);
cad_piquete.toFront();
cad_piquete.setLocationRelativeTo(null);
cad_piquete.setResizable(false);
cad_piquete.setVisible(true);
}
});
btnFormCadastro.setToolTipText("<html><i>Exibir formul\u00E1rio em detalhes</i></html>");
btnFormCadastro.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btCopiar.png")));
btnFormCadastro.setActionCommand("Cancel");
buttonPane.add(btnFormCadastro);
}
{
JButton btnCancelar = new JButton("");
btnCancelar.setToolTipText("<html><i>Cancelar opera\u00E7\u00E3o</i></html>");
btnCancelar.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btCancelar.png")));
btnCancelar.setActionCommand("Cancel");
buttonPane.add(btnCancelar);
}
{
JButton btnAtualisar = new JButton("");
btnAtualisar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
listarPiquetes("");
}
});
btnAtualisar.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btAtualiza.png")));
btnAtualisar.setToolTipText("<html><i>Cancelar opera\u00E7\u00E3o</i></html>");
btnAtualisar.setActionCommand("Cancel");
buttonPane.add(btnAtualisar);
}
{
JButton btnExcluir = new JButton("");
btnExcluir.setToolTipText("<html><i>Deletar item selecionado</i></html>");
btnExcluir.setIcon(new ImageIcon(View_Lista_Piquetes.class.getResource("/br/com/freedom/imagens/btExcluir.gif")));
btnExcluir.setActionCommand("Cancel");
buttonPane.add(btnExcluir);
}
}
}
private JTable getTblPiquetes() {
if (tblPiquetes == null) {
tblPiquetes = new JTable();
tblPiquetes.setModel(new Bov_piquete_TableModel());
tblPiquetes.setAutoResizeMode(tblPiquetes.AUTO_RESIZE_OFF);
tblPiquetes.getColumnModel().getColumn(0).setPreferredWidth(250);
tblPiquetes.getColumnModel().getColumn(1).setPreferredWidth(100);
tblPiquetes.getColumnModel().getColumn(2).setPreferredWidth(100);
tblPiquetes.getColumnModel().getColumn(3).setPreferredWidth(100);
tblPiquetes.getColumnModel().getColumn(4).setPreferredWidth(150);
}
return tblPiquetes;
}
private Bov_piquete_TableModel getModel() {
if (model == null) {
model = (Bov_piquete_TableModel) getTblPiquetes().getModel();
}
return model;
}
private List<Bov_piquete> getPiquetes(String nome) {
List<Bov_piquete> piquetes = new ArrayList<Bov_piquete>();
try {
piquetes = dao.listarTodosPiquetes(nome);
} catch (Exception e) {
e.printStackTrace();
}
return piquetes;
}
private void listarPiquetes(String descricao) {
List<Bov_piquete> piquetes = new ArrayList<Bov_piquete>();
try {
piquetes = dao.listarTodosPiquetes(descricao);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
getModel().limpar();
getModel().addListaDeUfs(piquetes);
}
public void atualizar(){
Bov_piquete bv = new Bov_piquete();
model.notifyUpdated(bv);
System.out.print(bv.getNome());
}
}
se poderem me ajudar fico grato amigos