Pessoal, preciso inserir alguns dados em uma Jtable mas nao sei como. Mais ou menos assim: O usuário faz um cadastro de seus dados, esses dados sao salvos em um arquivo, e posteriormente tem-se a possibilidade de exibir todos os nomes cadastrados na JTable. Onde devo invocar o método pra inserir nas celulas da jTable?
Valeuu.
Olá amigo.
A melhor maneira é vc construir sua própria tableModel como mostrado neste tutorial: http://www.guj.com.br/articles/140 http://www.guj.com.br/articles/147
Isso que vc quer fazer é bem simples, vc vai invocar um método que vc vai ter criado em seu modelo, algo como
public void addLine(SeuBean b)
{
seuArrayDeLinhas.add(b);
int ultimoIndice = getRowCount()-1;
fireTableRowsInserted(ultimoIndice, ultimoIndice);
}
Sei que pode parecer chato em primeira vista ter que construir seu próprio model, mas é extremamente útil no decorrer de toda a sua programação, e vc pode reutilizá-lo quando for necessário…
E por favor, não use o DefaultTableModel!!!
Abraços
Olá, aqui vou deixar um link pra vc explicando o porque o andre_bento falou sobre não usar o DefaultTableModel!!!
http://www.guj.com.br/java/230061-tablemodel-ou-defaulttablemodel
Espero ter ajudado!
Abraços!!!
Opa! É meu primeiro post aqui no GUJ! Espero ajudá-lo!
Podemos usar o JTable juntamente com um DefaultTableModel, que facilitará a manipulação de dados na tabela. Segue um exemplo:
// JTable com três linhas e três colunas
JTable tabela = new JTable(3, 3);
// As colunas da tabela
String colunas[] = {“Coluna 1”, “Coluna 2”, “Coluna 3”};
// Cria um DefaultTableModel para manipular os dados do JTable. Os parâmetros são um array que identifica as colunas e um int que seta o número inicial que linhas
DefaultTableModel modelo = new DefaultTableModel(colunas, 0);
// Insere os dados no DefaultTableModel
modelo.addRow(new String[]{“a1”, “b1”, “c1”});
modelo.addRow(new String[]{“a2”, “b2”, “c2”});
modelo.addRow(new String[]{“a3”, “b3”, “c3”});
// Associa o DefaultTableModel ao JTable
tabela.setModel(getDefaultTableModel());
Abraço!
Vi agora que o ViniGodoy recomenda nunca usar JTableModel e sim implementar. E vendo os motivos que ele citou eu concordo. Mas o que passei pode servir como um exemplo simples inicial para que você entenda como funciona, e então depois criar sua própria implementação.
Abraço!
Olá amigos!!
Amigo rogerfl, não utilize DefaultTableModel, pois ela vai “engessar” seu código, vai te dar dor de cabeça no futuro pois para coisas simples vc terá que dar voltas e mais voltas…
E como diz o mestre ViniGodoy
[quote]
Não use DefaultTableModel!!!
Motivos:
- É mais difícil que escrever seu próprio TableModel;
- É mais lento (usa classes sincronizadas);
- Ocupa mais espaço em memória (duplica seus dados);
- Deixa o código mais confuso e difícil de manter;
- Usa casts inseguros;
- Força que você tenha que exibir informações desnecessárias (como o ID) na tabela, ou controlar o ID numa lista separada;
- Faz a sua mulher te deixar, o leite da sua geladeira azedar, e pessoas apontarem o dedo para você na rua. [/quote]
Prefira a sua própria implementação, pois no decorrer do seu desenvolvimento, vc pode precisar de um método próprio por exemplo, que retorne algum valor, faça cálculos, ou não sei qualquer outra coisa.
Segue um pequeno exemplo de uma implementação minha com um filtro na table, para quando o usário digitar algo ele já vai filtrando e exibindo na table.
Isso vai variar da IDE que vc utiliza, eu por exemplo utilizo o NetBeans…
Crie uma tabela na sua tela, depois clique com o botão direito nela e vá em Personalizar código,… Apague o que está dentro de:nomeDaSuaTable.setModel(blá blá blá...)
Sua tabela irá ficar sem nada, calma, não se desespere…
Feito isso eu crio um campo onde o usuário possa digitar o nome da pessoa por exmplo para filtrar a table…
Agora a minha classe modelo:
[code]/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package Util;
import DAO.DAOSaidas;
import Model.Patrimonio;
import Model.SaidaPatrimonio;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableRowSorter;
/**
*
-
@author Andre
*/
public class MyTableSaidas extends AbstractTableModel {private static List linhas;
private String[] colunas = {“Código”,“Nome Solicitante”,“Itens”,“Data Retirada”};//private static List allSectors;
private TableRowSorter sorter;@Override
public int getRowCount() {
return linhas.size();}
@Override
public int getColumnCount() {
return colunas.length;}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
SaidaPatrimonio p = 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ãoas mesmas // que foram especificadas no array "colunas". switch (columnIndex) { // Seguindo o exemplo: "código","Descrição", "Quantidade", "setor"}; case 0: return p.getId(); case 1: return p.getNomePessoaPegou(); case 2: return p.getItensRetirados(); case 3: return p.getDataRetirada(); default: // Isto não deveria acontecer... throw new IndexOutOfBoundsException("columnIndex out of bounds"); }
}
@Override
public String getColumnName(int columnIndex) {
// Retorna o conteúdo do Array que possui o nome das colunas
return colunas[columnIndex];
}public SaidaPatrimonio getPatrimonio(int indiceLinha) { return linhas.get(indiceLinha);
}
/* Adiciona um registro. */
public void addSaidaPatrimonio(SaidaPatrimonio p) {
// Adiciona o registro.
linhas.add§;
//JOptionPane.showMessageDialog(null,linhas.get(0).getDescricaoPatrimonio());
int ultimoIndice = getRowCount()-1;
fireTableRowsInserted(ultimoIndice, ultimoIndice);
}/* Remove a linha especificada. */
public void removeSaidaPatrimonio(int indiceLinha) {
linhas.remove(indiceLinha);fireTableRowsDeleted(indiceLinha, indiceLinha);
}
/* Remove todos os registros. */
public void limpar() {
linhas.clear();fireTableDataChanged();
}
/* Verifica se este table model esta vazio. */
public boolean isEmpty() {
return linhas.isEmpty();
}/* Adiciona uma lista de Cliente ao final dos registros. */
public void addListaDeSaidasPatrimonios(List m) {
// Pega o tamanho antigo da tabela.
int tamanhoAntigo = getRowCount();// Adiciona os registros. linhas.addAll(m); fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
}
public Object[][] getAllThings(){
int row = getRowCount();
int col = getColumnCount();
Object[][] dados =new Object[row][4];for(int i=0;i<row;i++){ //dados[i][0] = getValueAt2(i, 0); //dados[i][1] = getValueAt2(i, 1); //dados[i][2] = getValueAt2(i, 2); // estou usando o primeiro valueAt pois já me retorna o Id dados[i][3] = getValueAt (i, 0); } return dados;
}
/* public Integer getIdInto(int row){
//Integer id = getValueAt3(row, 0);
return id;
}*/
public List fillingRows(){
try{
DAOSaidas daoSaidas = new DAOSaidas();
linhas = new ArrayList();
linhas = daoSaidas.getAllExits();
//addListaDeSaidas(linhas);
}
catch (Exception e){
JOptionPane.showMessageDialog(null, "Erro ao encher o table:"+e);
}
return linhas;
}
public void sorter(JTable table,final JTextField filterText,MyTableSaidas model){
sorter = new TableRowSorter<MyTableSaidas>(model);
table.setRowSorter(sorter);
table.setPreferredScrollableViewportSize(new Dimension(785, 220));
table.setFillsViewportHeight(true);
//setando o tamanho da coluna descrição,OBS
table.getColumnModel().getColumn(1).setPreferredWidth(50);
table.getColumnModel().getColumn(2).setPreferredWidth(200);
//For the purposes of this example, better to have a single
//selection.
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//Whenever filterText changes, invoke newFilter.
filterText.getDocument().addDocumentListener(
new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
newFilter(filterText);
}
public void insertUpdate(DocumentEvent e) {
newFilter(filterText);
}
public void removeUpdate(DocumentEvent e) {
newFilter(filterText);
}
});
}
private void newFilter(JTextField filterText) {
RowFilter<MyTableSaidas, Object> rf = null;
//If current expression doesn’t parse, don’t update.
try {
//para alterar qual campo será filtrado na tabela basta alterar o índice abaixo!
rf = RowFilter.regexFilter(filterText.getText(), 1);
} catch (java.util.regex.PatternSyntaxException e) {
return;
}
sorter.setRowFilter(rf);
}
public static List<SaidaPatrimonio> getAllExits(){
return linhas;
}
public String getIdIntoTheRow(JTable table){
int row = table.getSelectedRow();
String pk = String.valueOf(table.getValueAt(row, 0));
return pk;
}
/**Método construído para atualizar algum registro que foi atualizado em
* tempo de execução!
* Pego a linha e passo o objeto para poder atualizar o model e a table.
*/
public void setValue(int row, SaidaPatrimonio s){
linhas.set(row,s);
fireTableRowsUpdated(row, row);
}
public void requestFocusForFirstLine(JTable table){
table.addRowSelectionInterval(0, 0);
}
}
[/code]
Agora no construtor de minha tela(onde está a table) eu faço assim:
[code]
private static MyTableSaidas model;
/** Creates new form TelaMembros */
public TelaSaidas() {
initComponents();
model = new MyTableSaidas();
//método no modelo que retorna os meus registros no BD
model.fillingRows();
//seto a tabela com o NOSSO modelo
tblSaidas.setModel(model);
//Adiciona o sorter que foi criado em NOSSO modelo
model.sorter(tblSaidas, txtNomePesquisa, model);
txtNomePesquisa.requestFocus();
tblSaidas.getColumnModel().getColumn(0).setPreferredWidth(30);
tblSaidas.getColumnModel().getColumn(1).setPreferredWidth(180);
if(model.getAllExits().isEmpty()){
btnBaixar.setEnabled(false);
}else
model.requestFocusForFirstLine(tblSaidas);
}[/code]
Isso foi para uso em um projeto, que eu desenvolvi, mas vc pode pegar a idéia de trabalhar sobre ela…
Espero ter ajudado amigo, por favor, não opte pelo DefaultTableModel!!!
Abraços
Excelente dica andre_bento! Este foi meu primeiro post aqui no GUJ e já consegui aprender algo novo! Muito obrigado! Já fica a sugestão para o rodrigomagalhaes, o criador do post!
Abraço!
Que isso amigo…
Espero que te ajude e a outros amigos também que precisarem…
Depois testa ae e vê se funcionou legal cara!
Abraçoss