Explica é contexto de novo…?
Qual exatamente o erro, acontece quando e deveria ser qdo?
Se possível pode a Classe que tem o JTable pelo menos. (Se possível)
Abraço
Explica é contexto de novo…?
Qual exatamente o erro, acontece quando e deveria ser qdo?
Se possível pode a Classe que tem o JTable pelo menos. (Se possível)
Abraço
Não deveria ser necessário chamar repaint. Poste seu model completo e a claase que tem o Table.
Entao eu tenho, umas jTextfields. e dois botoes, gravar e excluir.
qdo faço modificações nas Jt a jtable nao atualiza (Não insere, não excluir e não altera) na hora, e tem q fechar e abrir de novo a Jframe dai ela atualiza.
já tentei colocar umas linhas mas acho q não coloquei as corretas.
segue a tableModel:
Lembrando que no banco de dados esta tudo ok, em relação as atualizações o problema é somente na table
depois tenho uma outra bem boa pra vcs que essa eu nao achei aqui no forum rsrs
public class ProdutoTableModel extends AbstractTableModel {
private static final int COL_CODIGO = 0;
private static final int COL_PRODUTO = 1;
private static final int COL_VALORPRODUTO = 2;
private static final int COL_ATIVO = 3;
private static final int COL_TIPOPRODUTO = 4;
private List<Produto> listaProdutos;
//Esse é um construtor, que recebe a nossa lista de livros
public ProdutoTableModel(List<Produto> listaProdutos) {
this.listaProdutos = new ArrayList<Produto>(listaProdutos);
}
@Override
public int getRowCount() {
//Quantas linhas tem sua tabela? Uma para cada item da lista.
return listaProdutos.size();
}
@Override
public int getColumnCount() {
//Quantas colunas tem a tabela? Nesse exemplo, só 5.
return 5;
}
@Override
public String getColumnName(int column) {
//Qual é o nome das nossas colunas?
if (column == COL_CODIGO) {
return "CÓDIGO";
}
if (column == COL_PRODUTO) {
return "PRODUTO";
}
if (column == COL_VALORPRODUTO) {
return "VALOR";
}
if (column == COL_ATIVO) {
return "PRODUTO ATIVO";
}
if (column == COL_TIPOPRODUTO) {
return "TIPO DE PRODUTO";
}
return ""; //Nunca deve ocorrer
}
@Override
public Object getValueAt(int row, int column) {
//Precisamos retornar o valor da coluna column e da linha row.
Produto produto = listaProdutos.get(row);
if (column == COL_CODIGO) {
return produto.getIdProduto();
} else if (column == COL_PRODUTO) {
return produto.getProduto();
} else if (column == COL_VALORPRODUTO) {
return produto.getValorProduto();
} else if (column == COL_ATIVO) {
return produto.getProdutoContinuado();
} else if (column == COL_TIPOPRODUTO) {
return produto.getTipoProduto();
}
return ""; //Nunca deve ocorrer
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
Produto produto = listaProdutos.get(rowIndex);
if (columnIndex == COL_CODIGO) {
produto.setIdProduto(rowIndex);
} else if (columnIndex == COL_PRODUTO) {
produto.setProduto(aValue.toString());
} else if (columnIndex == COL_VALORPRODUTO) {
produto.setValorProduto(Double.parseDouble(aValue.toString()));
} else if (columnIndex == COL_ATIVO) {
produto.setProdutoContinuado(Boolean.parseBoolean(aValue.toString()));
} else if (columnIndex == COL_TIPOPRODUTO) {
produto.setTipoProduto(aValue.toString());
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
//Qual a classe das nossas colunas? Como estamos exibindo texto, é string.
return Integer.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
//Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.
// if (columnIndex == COL_CODIGO) {
// return false;
// } else {
// return true;
// }
return false; // Aqui todas as celulas nao serão editaveis
}
public Produto get(int row) {
return listaProdutos.get(row);
}
public void setRemoveRow(int row) {
fireTableRowsDeleted(row, row);
}
}
SeuModel.getValueAt(SeuModel.getSelectedRow(), 0).toString()) // o 0 é a 1ª coluna
Ué, mas cadê os métodos de atualização da JTable?
Deveria ter método assim no seu model:
[code]
public void remove(int row) {
//Remove da lista
listaProdutos.remove(row);
//Avisa a tabela que foi removido
fireTableRowsDeleted(row, row);
}
public void add(Produto produto) {
//Adiciona na lista
listaProdutos.add(produto);
//Avisa a tabela que um novo produto foi inserido.
fireTableRowsInserted(listaProdutos.size()-1, listaProdutos.size()-1);
}[/code]
No método de remover da interface gráfica, você faria algo como:
public void actionPerformed(ActionEvent evt) {
int linhaSelecionada = seuTable.getSelectedRow();
if (linhaSelecionada == -1)
return;
Produto produtoSelecionado = seuModel.get(linhaSelecionada);
new ProdutoDao().remove(produtoSelecionado); //Manda remover do BD
seuModel.remove(linhaSelecionada); //Chama o remove do model para remover da tabela
}
As chamadas a “fire” dentro do model avisam a tabela que ela foi modificada. Quando o model faz um “fire” a Table fica sabendo que deve se redesenhar.
Caramba! Funcionou eu estava quase acertando rsrs.
a parte do tablemodel eu ja tinha feito, porem nao tinha feito a parte grafica.
a parte excluir ja esta funfando vou terminar agora. depois vou precisar de mais um dica rsrs.
eu tinha tudo isso funcionando no default… inclusive um metodo de pesquisa rapida q era show de bola agora com o tablemodel nao consegui mais fazer funfar.
bem vou terminar aqui. depois conversamos mais sobre a pesquisa.
abraço e boa noite
Oi vini boa tarde. ontem eu consegui mais uns avanços, a parte de exclusão ficou perfeita porém adicionar ele adiciona com erros. Top:
ele aparece na tabela durante a insersão, porem fica picado os dados, só aparece o nome do produto e o valor o resto fica em branco.
este trecho esta no tablemodel
public void setAdd(Produto produto) {
//Adiciona na lista
listaProdutos.add(produto);
//Avisa a tabela que um novo produto foi inserido.
fireTableRowsInserted(listaProdutos.size()+1, listaProdutos.size()+1);
}
public void setAtualiza(Produto produto){
fireTableDataChanged();
}
na classe grafica esta assim;
public void setGravarProduto() {
produto.setProduto(tfProduto.getText());
produto.setValorProduto(Double.parseDouble(tfValorProduto.getText().replaceAll(",", ".")));
TipoProduto obj = (TipoProduto) listaTipoProdutos.get(jcTipoProduto.getSelectedIndex());
produto.setIdTipoProduto(obj.getIdTipoproduto());
new ProdutoDAO().setAdiciona(produto); //Manda adicionar no BD
tableModelProduto.setAdd(produto); //Chama o add do model para adicionar na tabela
limparCampos();
btGravar.setEnabled(false);
}
public void setAlterarProduto() {
produto.setIdProduto(Integer.parseInt(tfIdProduto.getText()));
produto.setProduto(tfProduto.getText());
produto.setValorProduto(Double.parseDouble(tfValorProduto.getText().replaceAll(",", ".")));
TipoProduto obj = (TipoProduto) listaTipoProdutos.get(jcTipoProduto.getSelectedIndex());
produto.setIdTipoProduto(obj.getIdTipoproduto());
if (jCheckBox.isSelected()) {
produto.setProdutoContinuado(false);
} else {
produto.setProdutoContinuado(true);
}
new ProdutoDAO().setAltera(produto);
tableModelProduto.fireTableDataChanged();
limparCampos();
btGravar.setEnabled(false);
}
Abraço
O certo é size()-1 não size()+1 como você fez.
Você deve disparar no evento o índice que foi adicionado. Como ele já está na lista, ele será = size()-1.
Entao não é isso rs. eu tinha mudado para +1 para ver se mudava algo, mas nao era, e eu tinha esquecido de mudar para -1 novamente.
com isso nao consigo inserir corretamente e nem atualizar um campo.
Os codigos que passei estao corretos?
abs
Aparentemente sim.
Bom dia!.
olha como fica quando insere um produto novo.
e quando eu clico em cima tbm e mudo algo como o valor por exemplo ele tbm nao muda.
Já usou o depurador? Tem certeza de que esses campos estão preenchidos na classe no produto que está sendo inserido na tabela?
E nego está dificil rsrs
e olha que essa é fichinha pra outra que eu quero fazer. ne debug nao aparece erro nenhum.
deve estar falhando no update da jtable. pq esta inserindo normal.
veja como esta o jFrame:
public class FormProduto extends javax.swing.JFrame {
Produto produto = new Produto(WIDTH, null, Double.NaN, rootPaneCheckingEnabled, PROPERTIES, null, null);
ProdutoDAO produtoDAO = new ProdutoDAO();
TipoProduto tipoProdutos = new TipoProduto();
TipoProdutoDAO tipoProdutoDAO = new TipoProdutoDAO();
JLabel tfIdProduto = new JLabel();
// JcomboBox
List<TipoProduto> listaTipoProdutos = tipoProdutoDAO.getUpdateJtableTipo();
// Jtable
List<Produto> listProdutos = new ProdutoDAO().getUpdateJtable();
ProdutoTableModel tableModelProduto = new ProdutoTableModel(listProdutos);
public FormProduto() {
// AQUI TROCA O TAB PELO ENTER NA TRANSIÇÃO DE JTEXTFIELD
HashSet conj = new HashSet(this.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
conj.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, conj);
initComponents();
jTable1.setModel(tableModelProduto);
setUpdateJtable();
}
private void btFecharActionPerformed(java.awt.event.ActionEvent evt) {
this.dispose();
}
private void btLimparActionPerformed(java.awt.event.ActionEvent evt) {
limparCampos();
}
private void formWindowOpened(java.awt.event.WindowEvent evt) {
setPreencheList();
limparCampos();
}
private void btGravarActionPerformed(java.awt.event.ActionEvent evt) {
setHabilitaBtGravar();
if (tfIdProduto.getText().equals("")) {
setGravarProduto();
} else {
setAlterarProduto();
}
}
private void tfProdutoFocusLost(java.awt.event.FocusEvent evt) {
produto.setProduto(tfProduto.getText().toString());
if (produtoDAO.setProdutoExistente(produto) == false || tfProduto.getText().toUpperCase().equals("")) {
tfValorProduto.setEnabled(false);
btGravar.setEnabled(false);
limparCampos();
} else {
tfValorProduto.setEnabled(true);
tfValorProduto.requestFocus();
}
}
private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {
int i = jTable1.getSelectedRow();
tfIdProduto.setText(jTable1.getModel().getValueAt(i, 0).toString());
tfProduto.setText(jTable1.getModel().getValueAt(i, 1).toString());
tfValorProduto.setText(jTable1.getModel().getValueAt(i, 2).toString().replaceAll(",", "."));
jcTipoProduto.setSelectedItem(jTable1.getModel().getValueAt(i, 4));
produto.setIdProduto(Integer.parseInt(tfIdProduto.getText()));
if (produtoDAO.getPesquisaProdutoContinuado(produto) == true) {
jCheckBox.setSelected(false);
tfProduto.setEnabled(true);
tfValorProduto.setEnabled(true);
} else {
jCheckBox.setSelected(true);
tfProduto.setEnabled(false);
tfValorProduto.setEnabled(false);
}
btExcluir.setEnabled(true);
}
private void btExcluirActionPerformed(java.awt.event.ActionEvent evt) {
setRemoveLinhaTable();
limparCampos();
}
private void tfValorProdutoFocusLost(java.awt.event.FocusEvent evt) {
jcTipoProduto.requestFocus();
}
private void jcTipoProdutoItemStateChanged(java.awt.event.ItemEvent evt) {
btGravar.setEnabled(true);
btGravar.requestFocus();
}
private void btPesquisaActionPerformed(java.awt.event.ActionEvent evt) {
produto.setPesquisaRapida(tfPesquisaRapida.getText());
}
//
// Variables declaration - do not modify
private javax.swing.JButton btExcluir;
private javax.swing.JButton btFechar;
private javax.swing.JButton btGravar;
private javax.swing.JButton btLimpar;
private javax.swing.JButton btPesquisa;
private javax.swing.JCheckBox jCheckBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JPanel jPanel5;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
private javax.swing.JComboBox jcTipoProduto;
private javax.swing.JTextField tfPesquisaRapida;
private javax.swing.JTextField tfProduto;
private javax.swing.JFormattedTextField tfValorProduto;
// End of variables declaration
public void limparCampos() {
tfIdProduto.setText("");
tfProduto.setText("");
tfValorProduto.setText("");
tfPesquisaRapida.setText("");
jCheckBox.setSelected(false);
btGravar.setEnabled(false);
btExcluir.setEnabled(false);
jcTipoProduto.setSelectedItem(null);
}
private void setUpdateJtable() {
DefaultTableCellRenderer rendererCentro = new DefaultTableCellRenderer();
rendererCentro.setHorizontalAlignment(SwingConstants.CENTER);
DefaultTableCellRenderer rendererEsquerda = new DefaultTableCellRenderer();
rendererEsquerda.setHorizontalAlignment(SwingConstants.LEFT);
TableColumnModel modeloDaColuna = jTable1.getColumnModel();
modeloDaColuna.getColumn(0).setCellRenderer(rendererCentro);
modeloDaColuna.getColumn(1).setCellRenderer(rendererEsquerda);
modeloDaColuna.getColumn(2).setCellRenderer(rendererCentro);
modeloDaColuna.getColumn(3).setCellRenderer(rendererCentro);
modeloDaColuna.getColumn(4).setCellRenderer(rendererCentro);
modeloDaColuna.getColumn(0).setMaxWidth(60);
modeloDaColuna.getColumn(1).setMaxWidth(300);
modeloDaColuna.getColumn(2).setMaxWidth(70);
modeloDaColuna.getColumn(3).setMaxWidth(130);
modeloDaColuna.getColumn(4).setMaxWidth(150);
}
private void setPreencheList() {
for (TipoProduto tipoProduto : listaTipoProdutos) {
jcTipoProduto.addItem(tipoProduto.getTipoProduto());
}
}
public void setRemoveLinhaTable() {
int linhaSelecionada = jTable1.getSelectedRow();
if (tfIdProduto.getText().equals("")) {
JOptionPane.showMessageDialog(null, "Não há item selecionado para excluir");
} else {
produto = tableModelProduto.get(linhaSelecionada);
new ProdutoDAO().setExcluir(produto); //Manda remover do BD
tableModelProduto.setRemove(linhaSelecionada); //Chama o remove do model para remover da tabela
}
}
public void setHabilitaBtGravar() {
if (tfProduto.getText().equals("")) {
JOptionPane.showMessageDialog(null, "O Campo produto não pode estar em branco!");
btGravar.setEnabled(false);
} else if (tfValorProduto.getText().equals("")) {
JOptionPane.showMessageDialog(null, "O Campo valor do produto não pode estar em branco!");
btGravar.setEnabled(false);
} else if (jcTipoProduto.getSelectedItem() == null) {
JOptionPane.showMessageDialog(null, "O Campo tipo de produto não pode estar em branco!");
btGravar.setEnabled(false);
}
}
public void setGravarProduto() {
produto.setProduto(tfProduto.getText());
produto.setValorProduto(Double.parseDouble(tfValorProduto.getText().replaceAll(",", ".")));
TipoProduto obj = (TipoProduto) listaTipoProdutos.get(jcTipoProduto.getSelectedIndex());
produto.setIdTipoProduto(obj.getIdTipoproduto());
new ProdutoDAO().setAdiciona(produto); //Manda adicionar no BD
tableModelProduto.setAdd(produto); //Chama o add do model para adicionar na tabela
limparCampos();
btGravar.setEnabled(false);
}
public void setAlterarProduto() {
produto.setIdProduto(Integer.parseInt(tfIdProduto.getText()));
produto.setProduto(tfProduto.getText());
produto.setValorProduto(Double.parseDouble(tfValorProduto.getText().replaceAll(",", ".")));
TipoProduto obj = (TipoProduto) listaTipoProdutos.get(jcTipoProduto.getSelectedIndex());
produto.setIdTipoProduto(obj.getIdTipoproduto());
if (jCheckBox.isSelected()) {
produto.setProdutoContinuado(false);
} else {
produto.setProdutoContinuado(true);
}
new ProdutoDAO().setAltera(produto);
tableModelProduto.fireTableDataChanged();
limparCampos();
btGravar.setEnabled(false);
}
}
Esse objeto produto que está sendo alterado no método altera, onde você define o valor dele?
O ideal seria obter o produto pelo model, altera-lo, e depois dar um fireTableRowsUpdated.
Mais ou menos assim:
[code]int linhaSelecionada = jTable1.getSelectedRow();
if (linhaSelecionada == -1)
return;
//Obtemos o produto que está dentro do JTable
produto = tableModelProduto.get(linhaSelecionada);
produto.setProduto(tfProduto.getText());
produto.setValorProduto(Double.parseDouble(tfValorProduto.getText().replaceAll(",", “.”)));
TipoProduto obj = (TipoProduto) listaTipoProdutos.get(jcTipoProduto.getSelectedIndex());
produto.setIdTipoProduto(obj.getIdTipoproduto());
//Salvamos a alteração no banco
new ProdutoDAO().setAdiciona(produto); //Manda adicionar no BD
//Avisamos a tabela que o produto mudou
tableModelProduto.fireTableRowsUpdated(linhaSelecionada, linhaSelecionada);[/code]
Bom dia. vini
Demorei para retornar por causa das provas.
continuo com problemas, na hora de inserir um item novo, sai falhado, somente o nome fica lá perfeito porem o resto dos dados não saem, e qdo clico em cima dele aparece uma mensagem de nullpointer.
o codigo estão acima ele deleta e altera com perfeição. o problema é somente na hora de inserir.
Vini, descobri que nesse metodo esta voltando o codigo como null.
é por isso que esta falhando na tela, porém ainda nao tenho ideia de como resolver.
public void setAdd(TipoProduto tipoProduto) {
//Adiciona na lista
this.listaProdutos.add(tipoProduto);
//Avisa a tabela que um novo produto foi inserido.
fireTableRowsInserted(this.listaProdutos.size() - 1, this.listaProdutos.size() - 1);
}
kra por favor me ajudem… alguem ai sabe dizer como q eu faço pra ficar passando o nome completo ,por exemplo, na linha selecionada em uma tabela pequena …
pq qando eu faço sempre fica com os 3 pontos …