Duvidas ao gravar dados de uma JTable no banco

eu estou tendo um problema implementei uma classe onde eu do um extends em DefaultTableCellRenderer

faço as devidas validaçoes nas celulas da tabela…até ae td bem mas o problema eh q a validaçao soh serve quando eu nao estou no modo de edição

e pelo que percebi é gravado no banco oq consta no CellEditor e nao no CellRenderer entao ae esta o problema a validação só serve para a hora que perco o focu da celula agora qdo entro no modo de ediçao dela ela volta o valor antigo e na hora de salvar ela salva os valores que aparecem no modo ediçao

essa eh a classe de validaçao

[code]public class Colorir extends DefaultTableCellRenderer implements TableCellRenderer {

public Colorir() {
    setOpaque(true);
}
 
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column) {
    //Valida célula hora da tabela
    try {
        if (value != null && !value.equals("")) {
            if (value.toString().indexOf("_") == -1) {
                if (Integer.parseInt(value.toString().substring(0, 1)) >= 3) {                        
                    value = "";
                } else if (Integer.parseInt(value.toString().substring(0, 1)) >= 2 &&
                        Integer.parseInt(value.toString().substring(1, 2)) >= 4) {
                    setBackground(Color.RED);
                } else if (Integer.parseInt(value.toString().substring(3, 4)) >= 6) {
                    setBackground(Color.RED);
                }
            } else if (value.equals("__:__")) {
                value = "";
            } else {
                setBackground(Color.RED);
            }
        } else {
            setBackground(table.getBackground());
        }
        if (value != null) {
            setText(value.toString());
        }
    } catch (Exception e) {
    }
    return this;
}

public void validate() {
}

public void revalidate() {
}

protected void firePropertyChange(String propertyName,
        Object oldValue, Object newValue) {
}

public void firePropertyChange(String propertyName,
        boolean oldValue, boolean newValue) {
}[/code]

e aqui onde eu adiciono um component na celula escolhida da tabela

[code]public void FormataCampoHora() {
//Formata campo da tabela
try {
celulaHora = new MaskFormatter("##:##");
celulaHora.setPlaceholderCharacter(’_’);
} catch (ParseException e) {
e.printStackTrace();
}
// Jogando a máscara no JFTF
jftf = new JFormattedTextField(celulaHora);
jftf.setMargin(new java.awt.Insets(0, 0, 0, 0));

    for (int i = 0; i < 7; i++) {
        for (int j = 1; j < 16; j += 2) {

            if ((j % 2 == 1) && (j < 16)) {
                TableColumn col = tbHorarios.getColumnModel().getColumn(j);
                col.setCellEditor(new DefaultCellEditor(jftf));
            }
        }
    }
}[/code]

como eu faço pra validacao servir tanto no renderer qto no edit?

Obrigado.

Eu aconselharia você a rever sua implementação, por exemplo, você deve usar um Model extendendo AbstractTableModel, com isso você deixa a parte visual independente dos dados em si, ou seja, você trabalha com os dados do modelo e o usuário visualiza na tela do jeito que você definir, por exemplo um campo Data de um Javabean no modelo ele continua sendo do tipo java.util.Date, já para o usuário ele aparece como uma String formatada “dd/MM/yyyy”.

Segue um exemplo de um modelo (bem simples):

[code]import com.sikgraf.bean.Conta;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

/**
*

  • @author Francisco Souza
    */
    public class ContaTableModel extends AbstractTableModel {

    private static final String[] COLUMN_NAME = new String[]{“NOME DA CONTA”, “”};
    private static final Class[] COLUMN_TYPE = {String.class, Boolean.class};
    ArrayList lista;

    public ContaTableModel(ArrayList lista) {
    this.lista = lista == null ? new ArrayList() : lista;
    }

    public int getRowCount() {
    return (this.lista == null ? 0 : this.lista.size());
    }

    public int getColumnCount() {
    return ContaTableModel.COLUMN_TYPE.length;
    }

    @Override
    public Class getColumnClass(int col) {
    return COLUMN_TYPE[col];
    }

    @Override
    public boolean isCellEditable(int row, int col) {
    return false;
    }

    @Override
    public String getColumnName(int column) {
    return COLUMN_NAME[column];
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
    Conta item = (Conta) this.lista.get(rowIndex);
    switch (columnIndex) {
    case 0:
    return item;
    case 1:
    return item.isEmUso();
    }
    return “”;
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
    Conta item = this.lista.get(row);
    switch (col) {
    case 0:
    item.setNome((String) value);
    break;
    case 1:
    item.setEmUso((Boolean) value);
    }
    this.lista.set(row, item);
    fireTableCellUpdated(row, col);
    fireTableDataChanged();
    }

    public Conta getItemAt(int index) {
    if (lista == null) {
    return null;
    } else {
    return lista.get(index);
    }
    }

    public void setItemAt(int index, Conta item) {
    if (lista == null) {
    lista = new ArrayList();
    }
    lista.set(index, item);
    }

    public void addItem(Conta item) {
    if (lista == null) {
    lista = new ArrayList();
    }
    lista.add(item);
    fireTableDataChanged();
    }

    public ArrayList getLista() {
    return this.lista;
    }

    public void deleteRow(Conta item) {
    int index = lista.indexOf(item);
    lista.remove(item);
    fireTableRowsDeleted(index, index);
    }
    }[/code]

Para usar o modelo na JTable:

// Aqui, supondo que você já tem essa JTable lá, você coloca o modelo nela (com a lista populada) tabelaContas.setModel(new ContaTableModel(listaContas)); // Aqui você pega o modelo das colunas para definir as larguras, renderes, etc... TableColumnModel cm = tabelaContas.getColumnModel(); cm.getColumn(0).setHeaderRenderer(new TextHeaderRenderer()); int width = 25; cm.getColumn(1).setMinWidth(width); cm.getColumn(1).setMaxWidth(width); cm.getColumn(1).setPreferredWidth(width); ImageIcon icon = new ImageIcon(getClass().getResource("/com/sikgraf/imagens/buttons/Ok.gif")); // Essa coluna tem como header uma pequena imagem cm.getColumn(1).setHeaderRenderer(new IconRenderer()); cm.getColumn(1).setHeaderValue(new TxtIcon("Esta conta já está em uso?", icon));
Veja que no Renderer eu coloco o que quero.

Quando você for fazer o processo para salvar no banco de dados (provavelmente em um DAO) você pega a coleção inteira do modelo, nesse caso:

ArrayList<Conta> listaContas = ((ContaTableModel)tabelaContas.getModel()).getLista(); Iterator<Conta> it = listaContas.iterator(); while(it.hasNext()){ Conta conta = it.next(); // Aqui o codigo para inserir os dados de cada Javabean no banco de dados }

É apenas uma idéia, devem ter várias outras por aí…

vlw cara vou guardar esse modelo e fazer alguns teste esse fds

Obrigado.