Olá, a todos já estou ficando de cabelo em pé com isso. Procurei tutoriais na web, mas não conseguir nenhum. Parece que jTable é a parte tenebrosa do JAVA, que pode custar caro, no processo de aprendizado.
Como preencher um jTable com dados usando HIbernate?
9 Respostas
William, são duas coisas diferentes, a parte do hibernate basta fazer um método para retornar um List dos objetos.
A parte do JTable, você pode usar com TableModel, agora nas versões mais novas você pode utilizar Binding, inclusive o NetBeans gera com facilidade.
Dá uma procurada por isso, qualquer coisa me pede que te mando o link de um artigo a respeito, estou na pós e está bloqueado o acesso a algumas coisas.
William, são duas coisas diferentes, a parte do hibernate basta fazer um método para retornar um List dos objetos.A parte do JTable, você pode usar com TableModel, agora nas versões mais novas você pode utilizar Binding, inclusive o NetBeans gera com facilidade.
Dá uma procurada por isso, qualquer coisa me pede que te mando o link de um artigo a respeito, estou na pós e está bloqueado o acesso a algumas coisas.
Até ai é moleza… mais o Hibernate é capaz de dar um Refresh na JTable, depois que eu adicionar um novo dado?
Carregar os dados do banco no JTable nao em nada a haver com hibernate. O controle de adicionar , remover, alterar, refresh tudo isso eh via TableModel da sua JTable.
//Daniel
certo… então como faço para dar um refresh na jTable utilizando o DefaultTableModel?
É isso que eu estou “matutando”, cheguei até a apagar todo o sistema e vou recomeçar de novo… depois eu posto o código.
Fiz um exemplo rapido aqui.
Aprendi aqui no GUJ que eh bem melhor user AbstractTableModel ao inves de DefaultTableModel. Talvez vale a pena vc investir nisso tb.
Ai vai o codigo, desculpa eu to meio enferrujado em Swing.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;
@SuppressWarnings("serial")
public class JTableTest extends JFrame {
JTextField tName = new JTextField(10);
JTextField tEmail = new JTextField(10);
JButton bAdd = new JButton("Add");
JTable table = new JTable();
MyTableModel tmodel = new MyTableModel();
public JTableTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new BorderLayout());
Panel p1 = new Panel();
p1.add( new JLabel("Name : "));
p1.add(tName);
p1.add( new JLabel("Email : "));
p1.add(tEmail);
p1.add(bAdd);
table.setModel( tmodel );
bAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
tmodel.addRow(new User (tName.getText(), tEmail.getText()));
tmodel.fireTableDataChanged();
}
});
JScrollPane panelTable = new JScrollPane(table);
add(p1, BorderLayout.NORTH);
add( panelTable, BorderLayout.CENTER);
pack();
setVisible(true);
}
public static void main(String[] args) {
new JTableTest();
}
}
class User {
String _name, _email ;
public User(String name , String email) {
_name = name ;
_email = email;
}
public String getName() {
return _name;
}
public String getEmail() {
return _email;
}
}
@SuppressWarnings("serial")
class MyTableModel extends AbstractTableModel {
String[] column = {"Name", "Email" };
ArrayList<User> data = new ArrayList<User>();
@Override
public int getColumnCount() {
return column.length;
}
@Override
public int getRowCount() {
return data.size();
}
public String getColumnName(int columnIndex) {
return column[columnIndex];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
User user = data.get(rowIndex);
if(columnIndex == 0)
return user.getName();
else if(columnIndex == 1)
return user.getEmail();
else
return null;
}
public void addRow(User user) {
data.add( user );
}
public User getRow (int rowIndex) {
return data.get(rowIndex);
}
}
Fiz um exemplo rapido aqui. Aprendi aqui no GUJ que eh bem melhor user AbstractTableModel ao inves de DefaultTableModel. Talvez vale a pena vc investir nisso tb.Ai vai o codigo, desculpa eu to meio enferrujado em Swing.
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.table.AbstractTableModel; import java.util.ArrayList; @SuppressWarnings("serial") public class JTableTest extends JFrame { JTextField tName = new JTextField(10); JTextField tEmail = new JTextField(10); JButton bAdd = new JButton("Add"); JTable table = new JTable(); MyTableModel tmodel = new MyTableModel(); public JTableTest() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); Panel p1 = new Panel(); p1.add( new JLabel("Name : ")); p1.add(tName); p1.add( new JLabel("Email : ")); p1.add(tEmail); p1.add(bAdd); table.setModel( tmodel ); bAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { tmodel.addRow(new User (tName.getText(), tEmail.getText())); tmodel.fireTableDataChanged(); } }); JScrollPane panelTable = new JScrollPane(table); add(p1, BorderLayout.NORTH); add( panelTable, BorderLayout.CENTER); pack(); setVisible(true); } public static void main(String[] args) { new JTableTest(); } } class User { String _name, _email ; public User(String name , String email) { _name = name ; _email = email; } public String getName() { return _name; } public String getEmail() { return _email; } } @SuppressWarnings("serial") class MyTableModel extends AbstractTableModel { String[] column = {"Name", "Email" }; ArrayList<User> data = new ArrayList<User>(); @Override public int getColumnCount() { return column.length; } @Override public int getRowCount() { return data.size(); } public String getColumnName(int columnIndex) { return column[columnIndex]; } @Override public Object getValueAt(int rowIndex, int columnIndex) { User user = data.get(rowIndex); if(columnIndex == 0) return user.getName(); else if(columnIndex == 1) return user.getEmail(); else return null; } public void addRow(User user) { data.add( user ); } public User getRow (int rowIndex) { return data.get(rowIndex); } }
Legal, valeu por essa dica do AbstractTableModel, mas cada o código do refresh? Esse código só faz criar a JTable e adicionar os dados do bean.
Refresh ta no action do botao :
bAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
tmodel.addRow(new User (tName.getText(), tEmail.getText()));
tmodel.fireTableDataChanged();
}
});
O metodo fireTableDataChanged() do TableModel que faz isso, pra cada acao que vc tiver no JTable tipo remover, alterar dados, adicionar eh so chamar esse metodo.
//Daniel
Não deu certo aqui não brother.
Veja bem, eu to usando o Matisse do Netbeans para criar as telas. Não estou criando na unha como voce fez
Hummm nao conheco esse matisse nao e nunca usei NetBeans. Entao nao posso te ajudar muito com isso.
Mas faz o seguinte, copia e cola esse codigo num bloco de notas e compila, pra vc ver funcionando e ter uma ideia de como adaptar pro seu codigo.
Vc disse que ta usando hibernante, provavelmente vc tem uma classe que tem os mapeamentos, usando o meu codigo como exemplo vc pode passar o seu objeto ao inves de User. O metodo que se encarrega de carregar os dados no JTable eh o getValueAt :
public Object getValueAt(int rowIndex, int columnIndex) {
User user = data.get(rowIndex);
if(columnIndex == 0)
return user.getName();
else if(columnIndex == 1)
return user.getEmail();
else
return null;
}
Se vc perceber eu to coluna 0 da tabela carregando user.getName() e coluna 1 user.getEmail(). Se vc quer criar o seu proprio TableModel, esse metodo eh um bom lugar pra alterar.
String[] column = {"Name", "Email" };
Aqui tb, sao os titulos das colunas da tabela.
//Daniel