Ajuda com table model.[Resolvido]

11 respostas
R

Ola pessoal, optei por criar um table model próprio ao usar os que já existem, pois eu preciso apenas para um programa básico para calcular hora extra.
Eu já consegui popular minha tabela com todos os itens do banco de dados, porém não estou conseguindo usar direto o método setValueAt().

Abaixo segue o meu código:

package hora.extra.models;

import java.sql.Time;
import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import hora.extra.beans.Hora;

public class HoraTableModel extends AbstractTableModel {
	
	private List<Hora> linhas;
	private String[] colunas = {"Dia", "Entrada Manhã", "Saída Manhã", "Entrada Tarde", "Saida Tarde", "Entrada Extra", "Saída Extra"};
	
	public HoraTableModel() {
		
	}
	
	//Cria o Table Model com uma lista especifica
	public HoraTableModel(List<Hora> listaHora) {
		this.linhas = new ArrayList<Hora>(listaHora);
	}

	@Override
	public int getColumnCount() {
		return colunas.length; //Retorna a quantidade de colunas
	}

	@Override
	public int getRowCount() {
		return linhas.size(); //Retorna o número de linhas da tabela
	}
O código abaixo vai preencher a tabela usando o meu bean. Até aqui funciona perfeitamente.
//Retorna o valor de determinado índice
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		Hora hora = linhas.get(rowIndex);
		switch (columnIndex) {
		case 0: return hora.getDia();
		case 1: return hora.getHoraEntradaManha();
		case 2: return hora.getHoraSaidaManha();
		case 3: return hora.getHoraEntradaTarde();
		case 4: return hora.getHoraSaidaTarde();
		case 5: return hora.getHoraEntradaExtra();
		case 6: return hora.getHoraSaidaExtra();
		default: throw new IndexOutOfBoundsException("Coluna Index Out Of Bounds");
		}
	}
O problema vem exatamente nesse trecho do código, eu não estou conseguindo fazer com que o método setValueAt receba os valores conforme eu for aterando na tabela, traduzindo, ele não atualiza os dados na tela conforme eu vou digitando.
public void setValueAt(Time aValue, int rowIndex, int columnIndex) {
	
	}
	
	public String getColumnName(int columnIndex) {
		return colunas[columnIndex];
	};
	
	public boolean isCellEditable(int rowIndex, int colIndex) {
	    return true;
	}
}

Alguma dica?

11 Respostas

R

nobody? xD

R

Eu andei mexendo aqui e notei que quando eu uso atributos do tipo String, int, etc, eu consigo editar diretamente no Jtable, porém ao usar o atributo Time eu não consigo o mesmo resultado.

Alguém sabe o porque?

yfalbino

eu nao entendi direito sua duvida…

voce quer que ele va atualizando na tabela enquanto voce for digitando em um jTextField (por exemplo) ?

ViniGodoy

Poste seu setValueAt.

R

yfalbino:
eu nao entendi direito sua duvida…

voce quer que ele va atualizando na tabela enquanto voce for digitando em um jTextField (por exemplo) ?

Não, quando eu digitava diretamente na tabela, porém esse problema eu já resolvi em partes.

R
ViniGodoy:
Poste seu setValueAt.
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
	    Hora hora = linhas.get(rowIndex);
	    switch (columnIndex) {
                case 0: hora.setDia((String)aValue);
	    	break;
		case 1: hora.setHoraEntradaManha((Time)aValue);
		break;
		case 2: hora.setHoraSaidaManha((Time)aValue);
		break;
		case 3: hora.setHoraEntradaTarde((Time)aValue);
		break;
		case 4: hora.setHoraSaidaTarde((Time)aValue);
		break;
		case 5: hora.setHoraEntradaExtra((Time)aValue);
		break;
		case 6: hora.setHoraSaidaExtra((Time)aValue);
		break;
		default: throw new IndexOutOfBoundsException("Coluna Index Out Of Bounds");
		}
	    
	    fireTableCellUpdated(rowIndex, columnIndex);
	}

Note que a primeira coluna (Dia) é do tipo String, essa eu consigo realizar modificações e a mesma é atualizada toda vez que eu digito um valor. Porém todas as outras do tipo Time, eu sequer consigo digitar um valor nelas, e eu deixei o método isCellEditable() retornando true.

Porém eu acabei de reparar uma coisa, sempre que eu uso o atributo Time, os dados que deveriam aparecer na tabela como "10:00:00" viram uma data "01/01/1970", estou pensando deixar todas as colunas como String e ao gravar no banco de dados eu faço um cast para time, ou mesmo criar uma classe ou método para corrigir esse problema, vou dar uma olhada na doc do java amanhã para estudar melhor o atributo Time.

ViniGodoy

Não basta fazer cast do valor. Você precisa fazer parsing.

Não há nenhum método em seus frameworks que convertam uma String em um Time?

R

Ainda não, mas eu entendi a ideia, vou implementar amanhã e depois posto o resultado.

ViniGodoy

Vai vir um texto naquele objeto, não um Time.

Então, vc teria que usar algum método (como o Integer.parseInt, mas para o Time).

Que classe Time é essa?

R

Estou usando a java.sql.Time.

Estou só arrumando umas coisas no banco de dados e assim que terminar eu vou mudar os tipos de atributos que eu recebo na Jtable.
Obrigado pela ajuda, já deu uma boa clareada na mente aqui.

R

Eu fiz um cast para String ao mostrar os dados na JTable e funcionou perfeitamente, agora na hora de salvar no banco eu vou fazer um cast para Time.
Obrigado pela ajuda de todos

Criado 26 de fevereiro de 2013
Ultima resposta 5 de mar. de 2013
Respostas 11
Participantes 3