Gerar jtable em tempo de execucao

ola tudo bem…

estou com a seguinte duvida em relacao a jtable, como fazer gerar jtable em tempo de execucao numa pesquisa de trabalhadores em que o mesmo tipo ao pesquisar por “a” tenha 5 registro entao tera que ter 5 jtables sendo isso feito em tempo de execucao.

exibinda a informacoes equivalentes do mesmo isso sei como faz so a gerrar jtable q estou penando.

vc usar reflections

http://www.guj.com.br/articles/10

mas é algo bem complicado com jtable…

vc pode fazer um método que cria um jtable e depois executar ele com reflections quantas vezes precisar… ou alterar a metodologia q ta colocando no seu sistema…

Ou você pode usar o ObjectTableModel do projeto towel (link na minha assinatura).

Agora, você precisa mesmo gerar 5 JTables? Ou seriam 5 linhas num único JTable?

[quote=ViniGodoy]Ou você pode usar o ObjectTableModel do projeto towel (link na minha assinatura).

Agora, você precisa mesmo gerar 5 JTables? Ou seriam 5 linhas num único JTable?[/quote]

sim seriam 5 jatables em caso que a pesquisa retorna 5 trabalhadores, em caso podem ter mais ou mesnos…

a pesquisa não poderia ser listada um atras do outro pois são informações referente a funionários, tipo um dado funcionário pode ter mais de uma saida

tipo e feito pela uma pesquisa onde digita o nome o parte do mesmo.

tipo supondo que retornasse os cargos deste trabalhador nesta empresa e o mesmo tenha vários cargos na empresa… então listaria mais ou menos assim

nome funcionario: joao da silva
data efetivacao data finaliza cargo periodo salario
25/09/2010 25/12/2010 analista 3 meses 2.500,00
26/12/2010 gerente 5.000,00

nome funcionario: joao tres tres
data efetivacao data finaliza cargo periodo salario
12/09/2010 12/12/2010 programador 3 meses 1.000,00
26/12/2010 analista 2.500,00

acredirto que entenda melhor a situação…

[quote=ViniGodoy]Ou você pode usar o ObjectTableModel do projeto towel (link na minha assinatura).

Agora, você precisa mesmo gerar 5 JTables? Ou seriam 5 linhas num único JTable?[/quote]

o link da assinatura não veio

Deixa ver se eu entendi… é uma tabela por funcionário e cada funcionário tem uma lista de cargos. Simplificando, temos:

package br.com.exemplo.funcionarios;

import java.util.List;

public class Funcionario {

	private String nome;
	private List<Cargo> cargos;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public List<Cargo> getCargos() {
		return cargos;
	}

	public void setCargos(List<Cargo> cargos) {
		this.cargos = cargos;
	}
	
	// Hashcode, equals, toString, etc...

}

O cargo, por sua vez, teria um formato parecido com esse:

package br.com.exemplo.funcionarios;

import java.math.BigDecimal;
import java.util.Date;

public class Cargo {

	private String nome;
	private Date inicio;
	private Date fim;
	private Integer periodo;
	private BigDecimal salario;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Date getInicio() {
		return inicio;
	}

	public void setInicio(Date inicio) {
		this.inicio = inicio;
	}

	public Date getFim() {
		return fim;
	}

	public void setFim(Date fim) {
		this.fim = fim;
	}

	public Integer getPeriodo() {
		return periodo;
	}

	public void setPeriodo(Integer periodo) {
		this.periodo = periodo;
	}

	public BigDecimal getSalario() {
		return salario;
	}

	public void setSalario(BigDecimal salario) {
		this.salario = salario;
	}
	
	// Hashcode, equals, toString, etc...

}

Neste caso, tudo oq vc precisa é de um model adequado:

package br.com.exemplo.funcionarios;

import java.util.List;

import javax.swing.table.AbstractTableModel;

public class CargoTableModel extends AbstractTableModel {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private List<Cargo> cargos;
	
	public CargoTableModel(Funcionario funcionario) {
		this(funcionario.getCargos());
	}

	public CargoTableModel(List<Cargo> cargos) {
		super();
		this.cargos = cargos;
	}

	@Override
	public int getColumnCount() {
		return 5;
	}

	@Override
	public int getRowCount() {
		return this.cargos.size();
	}

	@Override
	public Object getValueAt(int row, int col) {
		Cargo cargo = cargos.get(row);
		switch (col) {
		case 0:
			return cargo.getInicio();
		case 1:
			return cargo.getFim();
		case 2:
			return cargo.getNome();
		case 3:
			return cargo.getPeriodo();
		case 4:
			return cargo.getSalario();
		}
		return null;
	}

}

Daí, pra cada funcionário basta criar um JTable usando este model.

meuContainer.add(new JTable(new CargoTableModel(meuFuncionario)));

Ou algo assim. Exitem várias maneiras e a melhor delas depende do cenário. Isso é um esboço.

obrigado a todods eu criei o metodo que resolveu meu problema, so que surgiu problema de layout conforme descrevo abaixo do código

[code] public void createTables(){

	if (panelTables.getComponentCount()>0){
		panelTables.removeAll();
	}	

	for (Funcionario func: buscaFuncionario()) {	

		STable<FuncionarioVO> table = new STable<FuncionarioVO>(
				new String[]{"NomeFuncionario","DataEfetivacao","Periodo","Cargo", "Salário"},
				new String[]{"nome","dtEfetivacao","periodo","cargo","salario"},
				STable.DEFAULT_ALTERNATE_ROW_COLOR);
		table.columnsAlignment(new int []{STable.ALIGN_CENTER, STable.ALIGN_CENTER,STable.ALIGN_CENTER,STable.ALIGN_CENTER} );
		
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		table.add(func);
		table.setLayout(new GridLayout(0,1,15,0));
		
		SLabel lblNameFunc = new SLabel();
		java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("BundlePeriodoSemestral");
		SLabel lblNome = new SLabel(bundle.getString("BuscaFuncionarioPeriodoSemestral.lblNameFunc.label"));
		lblNameFunc.setValue(func.getNrRgFunc()+"-"+func.getNome());
		lblNameFunc.setHorizontalTextPosition(JLabel.LEFT);
		lblNameFunc.setVerticalTextPosition(JLabel.BOTTOM);
		lblNameFunc.setBounds(0, 1, 0, 0);
		
		panelTables.add(new SLabel(lblNome.getLabelText()+" "+lblNameFunc.getLabelText()));
		
		panelTables.add(new JScrollPane(table));
	}
	
	this.updateUI();
	
}[/code]

o único problema que estou é referente ao espaçamento de uma tabela para outra… e o texto fica acima da tabela so fica alinhado a esquerda, acredito que seja problema do layout utilizado, estou utilizando GridLayout :

panelTables.setLayout(new GridLayout(0, 1, 0, 0));

como faria colocar os valores de espaçamento fixo, sem que o layout divide pelo numero de componente e divide a distancia igualmente

Tente criar um JPanel para cada tabela, algo assim:

	public void createTables(){
		
		if (panelTables.getComponentCount()>0){
			panelTables.removeAll();
		}	

		for (Funcionario func: buscaFuncionario()) {	

			STable<FuncionarioVO> table = new STable<FuncionarioVO>(
					new String[]{"NomeFuncionario","DataEfetivacao","Periodo","Cargo", "Salário"},
					new String[]{"nome","dtEfetivacao","periodo","cargo","salario"},
					STable.DEFAULT_ALTERNATE_ROW_COLOR);
			table.columnsAlignment(new int []{STable.ALIGN_CENTER, STable.ALIGN_CENTER,STable.ALIGN_CENTER,STable.ALIGN_CENTER} );
			
			table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			
			table.add(func);
			table.setLayout(new GridLayout(0,1,15,0));
			
			SLabel lblNameFunc = new SLabel();
			java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("BundlePeriodoSemestral");
			SLabel lblNome = new SLabel(bundle.getString("BuscaFuncionarioPeriodoSemestral.lblNameFunc.label"));
			lblNameFunc.setValue(func.getNrRgFunc()+"-"+func.getNome());
			lblNameFunc.setHorizontalTextPosition(JLabel.LEFT);
			lblNameFunc.setVerticalTextPosition(JLabel.BOTTOM);
			lblNameFunc.setBounds(0, 1, 0, 0);
			
			// panelTables.add(new SLabel(lblNome.getLabelText()+" "+lblNameFunc.getLabelText()));
			
			// panelTables.add(new JScrollPane(table));

			JPanel pnlFunc = new JPanel();
			pnlFunc.add(new SLabel(lblNome.getLabelText()+" "+lblNameFunc.getLabelText()), BorderLayout.NORTH);
			pnlFunc.add(new JScrollPane(table), BorderLayout.CENTER);
			panelTables.add(pnlFunc);
		}
		
		this.updateUI();
		
	}