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.
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.
[quote=rfgallon]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.[/quote]
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);
}
}
[quote=windsofhell]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.
[code]
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);
}
}
[/code][/quote]
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