Olá pessoal,
Preciso criar um método para excluir uma linha selecionada usando o AbstractTableModel, alguém poderia me orientar.
Segue abaixo os trechos do fonte:
public class AdmTableModel extends AbstractTableModel {
//Variaveis
private static final int COL_ID = 0;
private static final int COL_LOGIN = 1;
private static final int COL_NOME = 2;
private final List<Administrador> lista;
//Criando o construtor da classe
public AdmTableModel(List<Administrador> valores) {
this.lista = new ArrayList<>(valores);
}
@Override
public int getRowCount() {
return lista.size();
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public String getColumnName(int column) {
//Variaveis
String cNomeCol = "";
//Verifica o nome da coluna
if (column == COL_ID){
cNomeCol = "Código";
}else if(column == COL_LOGIN){
cNomeCol = "Login";
}else if(column == COL_NOME){
cNomeCol = "Nome";
}else{
cNomeCol = ""; //Nunca deve ocorrer
}
return cNomeCol;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
//Instanciando o objeto
Administrador objAdm = lista.get(rowIndex);
//Verificando o valor de cada coluna
if (columnIndex == COL_ID){
return objAdm.getCod();
}else if(columnIndex == COL_LOGIN){
return objAdm.getLogin();
}else{
return ""; //Nunca deve ocorrer
}
}
@Override
public void setValueAt(Object valor, int rowIndex, int columnIndex) {
Administrador objAdm = lista.get(rowIndex);
if (columnIndex == COL_ID){
objAdm.setCod(valor.toString());
}else if(columnIndex == COL_LOGIN){
objAdm.setLogin(valor.toString());
}
fireTableCellUpdated(rowIndex, columnIndex);
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public Administrador get(int row) {
return lista.get(row);
}
public void removeRow(int row) {
this.lista.remove(row);
this.fireTableRowsDeleted(row, row);
}
}
private void btnExcluirMouseClicked(java.awt.event.MouseEvent evt) {
int nSel = objTBAdm.getSelectedRow();
objModel.removeRow(nSel);
}
O que você fez está certo. Está dando problema?
Se estiver, poste o trecho que você cria o model e o trecho onde você inicializa a variável objModel.
Olá ViniGodoy,
Segue abaixo os trechos:
String cPesquisa = "";
List<Administrador> listaAdm;
AdministradorDAO objAdmDAO = new AdministradorDAO();
AdmTableModel objModel;
//Retorna a lista dea administradores
listaAdm = objAdmDAO.CarregaAdm();
//Insere a lista no JTable
objTBAdm.setModel(new AdmTableModel(listaAdm));
//Retorna o codigo posterior ao ultimo registro inserido no campo Codigo
txtCodigo.setText(objAdmDAO.RetUltCod());
Desculpe esqueci de mencionar, erro não apresenta, mas também não faz nada.
Agradeço desde já.
E a inicializacao da variácel objModel, cade?
Andei mexendo no fonte e deixei dessa forma:
AdmTableModel objModel = new AdmTableModel(listaAdm);
Mas quando tento chamar o form, acusa esse erro:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.util.ArrayList.<init>(ArrayList.java:164)
at br.com.controller.AdmTableModel.<init>(AdmTableModel.java:24)
at br.com.view.TAdministradores.<init>(TAdministradores.java:30)
at br.com.view.TPrincipal.lblIconePastaMouseClicked(TPrincipal.java:87)
at br.com.view.TPrincipal.access$000(TPrincipal.java:18)
at br.com.view.TPrincipal$1.mouseClicked(TPrincipal.java:58)
at java.awt.Component.processMouseEvent(Component.java:6508)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4501)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Essa exceção indica que a lista passada para o model está nula, verifique seu DAO.
Além disso certifique-se que você não está criando seu model 2 vezes, uma na tabela e outra na variável objModel.
AdmTableModel objModel = new AdmTableModel(listaAdm);
ObjTBAdm.setModel(objModel); //sem outro new
Ou, melhor ainda, remova a variável objModel e coloque um método assim:
public AdmTableModel getModel() {
return (AdmTableModel) objTBAdm.getModel();
}
Olá Viny.
Obrigado pela dica, funcionou diretinho.
Segue abaixo o resultado caso alguém esteja passando pelo mesmo problema:
public AdmTableModel getModel() {
return (AdmTableModel) objTBAdm.getModel();
}
E o evento adicionado no botão Excluir
//Chama o método para remover a linha do JTable
getModel().removeRow(nSel);