Bom dia a todos,
Estou com um problema de edição de célula na minha tabela e gostaria de ajuda.
O problema é o seguinte, criei um model para a tabela e neste model tem as colunas que podem ser editadas, porém, quando edito a celula e saio da mesma o valor desaparece. Como posso fazer para o valor persistir na celula que foi digitada?
Segue abaixo o codigo usado:
Código do modelo criado:import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.table.*;
/**
*
*
* @author Visitante
*/
public class TabelaVendaProduto extends AbstractTableModel{
private Object[] objeto;
private List<Object[]> listaObjetos;
private String[] colunas = new String[]{"Código", "Produto", "Quantidade", "Desconto", "Preço Unitário", "Preço Total"};
public TabelaVendaProduto(){
if (listaObjetos == null)
listaObjetos = new ArrayList<Object[]>();
objeto = new Object[]{"", "", "", "", "", ""};
listaObjetos.add(objeto);
}
public TabelaVendaProduto(List<Object[]> listaObject){
listaObjetos = new ArrayList<Object[]>(listaObject);
}
//Carrega objeto na lista
public void setObjeto(Object[] obj){
objeto = obj;
listaObjetos.add(objeto);
}
//Retorna um objeto da lista da tabela
public Object[] getObjeto(int indiceLinha){
return listaObjetos.get(indiceLinha);
}
//Retorna a quantidade de colunas
@Override
public int getColumnCount(){
return colunas.length;
}
//Retorna a quantidade de linhas
@Override
public int getRowCount(){
return listaObjetos.size();
}
//Retorna o nome de uma coluna específica
@Override
public String getColumnName(int coluna){
return colunas[coluna];
}
//Define o tipo de retorno
@Override
public Class<?> getColumnClass(int columnIndex){
switch (columnIndex){
case 0:
return String.class;
case 1:
return String.class;
case 2:
return String.class;
case 3:
return String.class;
case 4:
return String.class;
case 5:
return String.class;
default:
throw new IndexOutOfBoundsException("ColumnIndex out of bounds");
}
}
@Override
public Object getValueAt(int linha, int coluna){
switch (coluna){
case 0:
return listaObjetos.get(linha)[coluna];
case 1:
return listaObjetos.get(linha)[coluna];
case 2:
return listaObjetos.get(linha)[coluna];
case 3:
return listaObjetos.get(linha)[coluna];
case 4:
return listaObjetos.get(linha)[coluna];
case 5:
return listaObjetos.get(linha)[coluna];
default:
throw new IndexOutOfBoundsException("Column out of bounds");
}
}
public void setValutAt(Object dados, int linha, int coluna){
objeto = listaObjetos.get(linha);
objeto[coluna] = dados;
listaObjetos.add(linha, objeto);
fireTableCellUpdated(linha, coluna);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex){
if (columnIndex < 2){
return false;
} else {
return true;
}
}
public void addObjeto (Object[] obj){
listaObjetos.add(obj);
int ultimoIndice = getRowCount() - 1;
fireTableRowsInserted(ultimoIndice, ultimoIndice);
}
public void removeObjeto(int indiceLinha){
listaObjetos.remove(indiceLinha);
fireTableRowsDeleted(indiceLinha, indiceLinha);
}
public void addListaObjeto(List<Object[]> listaObj){
limpar();
int tamanhoAntigo = getRowCount();
listaObjetos.addAll(listaObj);
fireTableRowsInserted(tamanhoAntigo, getRowCount() -1);
}
public void limpar(){
listaObjetos.clear();
fireTableDataChanged();
}
public boolean isEmpty(){
return listaObjetos.isEmpty();
}
}
private void construirTabelaVendaProduto(){
tbVendaProduto.setModel(new TabelaVendaProduto());
tbVendaProduto.setAutoCreateRowSorter(true);
tbVendaProduto.setRowHeight(25);
tbVendaProduto.getColumnModel().getColumn(0).setPreferredWidth(50);
tbVendaProduto.getColumnModel().getColumn(1).setPreferredWidth(400);
tbVendaProduto.getColumnModel().getColumn(2).setPreferredWidth(50);
tbVendaProduto.getColumnModel().getColumn(3).setPreferredWidth(50);
tbVendaProduto.getColumnModel().getColumn(4).setPreferredWidth(50);
tbVendaProduto.getColumnModel().getColumn(5).setPreferredWidth(50);
}
private TabelaVendaProduto getModel() {
if (modeloVendaProduto == null) {
modeloVendaProduto = (TabelaVendaProduto) tbVendaProduto.getModel();
}
return modeloVendaProduto;
}
private void tbVendaProdutoKeyPressed(java.awt.event.KeyEvent evt) {
// TODO add your handling code here:
if (evt.getKeyCode() == KeyEvent.VK_ENTER){
int linha = tbVendaProduto.getSelectedRow();
int coluna = tbVendaProduto.getSelectedColumn();
if (coluna == 0){
JDialog consultarPop = this.criaDialogConsulta(Utils.PRODUTO);
consultarPop.setVisible(true);
produtoSelecionado = painelConsulta.getProdutoSelecionado();
vendaProduto = new Object[]{
produtoSelecionado.getCodProduto(),
produtoSelecionado.getDescricao(),
"1",
"",
produtoSelecionado.getValorVenda(),
""
};
if (listaVendaProduto == null)
listaVendaProduto = new ArrayList<Object[]>();
listaVendaProduto.add(vendaProduto);
((TabelaVendaProduto)tbVendaProduto.getModel()).addListaObjeto(listaVendaProduto);
tbVendaProduto.setColumnSelectionInterval(coluna + 2, coluna + 2);
}
if (coluna == 5){
if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
evt.consume();
vendaProduto = new Object[]{"", "", "", "", "", ""};
if (tbVendaProduto.getSelectedRow() == tbVendaProduto.getRowCount() - 1){
((TabelaVendaProduto)tbVendaProduto.getModel()).addObjeto(vendaProduto);
}
tbVendaProduto.setSurrendersFocusOnKeystroke(true);
tbVendaProduto.setColumnSelectionInterval(0, 0);
tbVendaProduto.setRowSelectionInterval(linha + 1, linha + 1);
}
}
}
if (evt.getKeyCode() == KeyEvent.VK_DELETE){
int response = JOptionPane.showConfirmDialog(this, "Tem certeza que deseja excluir este ítem?");
if (response == JOptionPane.YES_OPTION) {
int linha = tbVendaProduto.getSelectedRow();
((TabelaVendaProduto)tbVendaProduto.getModel()).removeObjeto(linha);
listaVendaProduto.remove(linha);
if (((TabelaVendaProduto)tbVendaProduto.getModel()).getRowCount() == 0){
vendaProduto = new Object[]{"", "", "", "", "", ""};
((TabelaVendaProduto)tbVendaProduto.getModel()).addObjeto(vendaProduto);
}
}
}
}
Utilizo o NetBeans e gostaria de ajuda para resolver esse problema.
Grato.