Como preencher um jTable com dados usando HIbernate?

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