Duvidas ao gravar dados de uma JTable no banco

2 respostas
furacao123

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
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) {
    }
e aqui onde eu adiciono um component na celula escolhida da tabela
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));
                }
            }
        }
    }

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

Obrigado.

2 Respostas

javer

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):
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<Conta> lista;

    public ContaTableModel(ArrayList<Conta> lista) {
        this.lista = lista == null ? new ArrayList<Conta>() : 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<Conta>();
        }
        lista.set(index, item);
    }

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

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

    public void deleteRow(Conta item) {
        int index = lista.indexOf(item);
        lista.remove(item);
        fireTableRowsDeleted(index, index);
    }
}
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í....

furacao123

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

Obrigado.

Criado 12 de janeiro de 2009
Ultima resposta 16 de jan. de 2009
Respostas 2
Participantes 2