Problema com DefaultRenderer e TableModel

Estou com problema ao colorir uma linha na jTable. Quando usava DefaultTableModel ele coloria todas as células correspondentes ao critério, mas agora, com o meu TableModel implementado, a primeira e última célula não é colorida ou sublinhada, somente as intermediárias. Abaixo está o DefaultRenderer sobescrito.

 jTable2.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                this.setHorizontalAlignment(CENTER);
                Object ref = model.getValueAt(row, 3);
                if (ref != null && ref.equals("DISPONÍVEL")) {
                   setBackground(Color.cyan);
                    setForeground(Color.black);
                    setFont(new Font("Tahoma", Font.BOLD, 12));
                } else {
//                    setBackground(Color.cyan);
                    setForeground(Color.black);
                    setFont(new Font("Tahoma", 0, 12));

                }
                return this;
            }
        });

Agora o meu modelo logo abaixo.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package FormsConsulta;

import Classes2.Itens;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import login.Classes.DB;
import login.Classes.Query;

/**
 *
 * @author MARCOS
 */
public class TableModelConsulta extends AbstractTableModel {

    private String[] columnNames = {"Código de Barras", "Descrição", "Disponibilidade", "Status"};
    private ArrayList data = new ArrayList();
    private Itens item;

    public TableModelConsulta (String sql) {
        super();

        DB banco2 = new DB();
        banco2.connect();
        Query carregaArray = new Query(banco2.conn);
        carregaArray.open(sql); 
           
        int codigo;
        String codigodebarras;
        String descricao;
        String disponibilidade;
        String status;   

        item = new Itens();
        data = new ArrayList();
        try {
            while (carregaArray.next()) {
                codigo = carregaArray.rs.getInt("codigo");
                codigodebarras = carregaArray.rs.getString("codigodebarras");
                descricao= carregaArray.rs.getString("descricao");
                disponibilidade = carregaArray.rs.getString("disponibilidade");
                status = carregaArray.rs.getString("status");
                              
                item.setCodigo(codigo);
                item.setCodigodebarras(codigodebarras);
                item.setDescricao(descricao);
                item.setDisponibilidade(disponibilidade);
                item.setStatus(status);             

                //Colocar os gets para poder funcionar corretamente
                data.add(new Itens(item.getCodigo(),
                        item.getCodigodebarras(),
                        item.getDescricao(),
                        item.getDisponibilidade(),
                        item.getStatus()));

            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }

        banco2.disconnect();

    }

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {
//            return data.length;
        //Alterado para ArrayList
        return data.size();
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

//Aqui so vai aparecer 4 colunas, mas tem o codigo, que nao coloco para visualizar na tela
    public Object getValueAt(int row, int col) {
        //pega os nomes da linha
        Itens item2 = (Itens) data.get(row);
        data.get(row);

        switch (col) {                
            case 0:
                return item2.getCodigodebarras();
            case 1:
                return item2.getDescricao();
            case 2:
                return item2.getDisponibilidade();
            case 3:
                return item2.getStatus();           
            default:
                return null; // isso nunca deve ocorrer
            }
   
    }

    /*
     * JTable uses this method to determine the default renderer/
     * editor for each cell.  If we didn't implement this method,
     * then the last column would contain text ("true"/"false"),
     * rather than a check box.
     */
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    /*
     * Don't need to implement this method unless your table's
     * editable.
     */
    public boolean isCellEditable(int row, int col) {
        //Note that the data/cell address is constant,
        //no matter where the cell appears onscreen.
//        if (col < 2) {
//            return false;
//        } else {
//            return true;
//        }
        return false;
    }

    /*
     * Don't need to implement this method unless your table's
     * data can change.
     *  @param rowrow row number
     * @param colcolumn column number
     */
    public void setValueAt(Object value, int row, int col) {
        //data[row][col] = value;
        //Alterado para ArrayList
//        ArrayList colArrayList = (ArrayList) data.get(row);
//        colArrayList.set(col, value);
//            fireTableCellUpdated(row, col);
    }

    /*Insere uma nova linha na tabela*/
    public void insertRow(ArrayList newrow) {
        data.add(newrow);
        super.fireTableDataChanged();
    }

    /* Deleta a linha especificada da tabela.
     *
     * @param row number
     */
    public void deleteRow(int row) {
        data.remove(row);
        super.fireTableDataChanged();
    }

    /* Delete all the rows existing after the selected row from the JTable
     *
     * @param row number
     */
    public void deleteAfterSelectedRow(int row) {

        // Get the initial size of the table before the deletion has started.
        int size = this.getRowCount();

        // The number of items to be deleted is got by subtracting the

        // selected row + 1 from size. This is done because as each row is deleted
        // the rows next to it are moved up by one space and the number of rows
        // in the JTable decreases. So the technique used here is always deleting
        // the row next to the selected row from the table n times so that all the
        // rows after the selected row are deleted.
        int n = size - (row + 1);

        for (int i = 1; i <= n; i++) {
            data.remove(row + 1);
        }
        super.fireTableDataChanged();
    }

    /**
     * retorna o valor da linha(row) especificada como um ArrayList.
     *
     * @param row number
     *
     * @return ArrayList!
     */
    public ArrayList getRow(int row) {
        return (ArrayList) data.get(row);
    }

    /**
     * Atualiza a linha especificada. Ele substitui a linha(row) no ArrayList
     * na especificada linha(row) com o novo ArrayList.
     *
     * @param updatedRowArrayList row data
     * @param rowrow row number
     */
    public void updateRow(ArrayList updatedRow, int row) {
        data.set(row, updatedRow);
        super.fireTableDataChanged();
    }

    /**
     * Limpa os dados da tabela.
     */
    public void clearTable() {
        data = new ArrayList();
        super.fireTableDataChanged();

    }
//   
}

No meu form de Consulta coloco no botão para carregar todos os registros, para o filtro, no txtConsulta coloco o newFilter da SUN que é muito mais simples e sem problema algum e é só alterar o índice de acordo com a coluna que quer filtrar. Declaro Primeiro como privadas as variáveis:

  private TableRowSorter<TableModelConsulta> sorter;
  private TableModelConsulta model;

Esse é o filtro. Muito simples e pequeno.

 /**
     * Atualiza a expressão regular do filtro da linha da expressão
     * na caixa de texto. Filtra na jTable quando digita.
     */
    private void newFilter(int coluna) {
        RowFilter<TableModelConsulta, Object> rf = null;
        //If current expression doesn't parse, don't update.
        try {
            rf = RowFilter.regexFilter(txtConsulta.getText(), coluna);
        } catch (java.util.regex.PatternSyntaxException e) {
            return;
        }
        sorter.setRowFilter(rf);
    }

código do botão que carrega todos os dados.

 private void btnTodosActionPerformed(java.awt.event.ActionEvent evt) {
String sql="SELECT codigodebarras,descricao,disponibilidade,status FROM itens";
 model = new TableModelConsulta(sql);
        jTable2.setModel(model);
        sorter = new TableRowSorter<TableModelConsulta>(model);
        jTable2.setRowSorter(sorter);

}

Agora o código do txtConsulta, que ao digitar, será filtrado na jTable.

 private void txtConsultaKeyReleased(java.awt.event.KeyEvent evt){                                        

        //Se for verdadeiro,então vai receber mais um criterio no sql
        //por causa dos forms de empréstimos e reservas
//        String campo = null;
       
            switch (cbFiltro.getSelectedIndex()) {
                case 0:
                    //Código de Barras
                    newFilter(0);
                    break;
                case 1:
                    //Descricao
                    newFilter(1);
                    break;              
            }
        } 
                  

Pronto. Preciso tambem que verifiquem o meu modelo, porque tem metodos que nao funcionam corretamente. Nao uso todos ainda e nao testei todos por enquanto. So estou usando esse modelo porque a consulta pode ser feita em tempo real depois de carregada no banco de dados e tem um filtro muito simples. Estou precisando tambem no modelo, que ainda nao consegui consertar, pegar o valor quando clicar na linha, mas esse valor seria de uma celula. O getValueAt so pega das colunas que estao na tabela e nao pega o codigo que esta no array e nao na tabela e consertar o problema que nao mostra a primeira e ultima celula colorida ou preenchida com a cor escolhida no DefaultRenderer, somente quando uso DefaulTableModel. Expliquei bem meu problema e espero que seja o suficiente. Com relacao ao modelo, se tiver que melhorar a implementacao, pode dar sugestoes com codigo, logico.

Já resolvi tudo. O problema era que eu estava com valores inteiros e só pode ser String ou Object, se não ele não deixa a linha colorida. Então fiz um cast. Agora estou usando também outro modelo que foi implementado e esse é melhor porque já é bem genérico e portanto não preciso criar um modelo pra cada consulta minha.

bom dia amigo, poderia colocar esse novo modelo aki pra nós tentarmos adptar?

é que estou tentando fazer um e nao estou conseguindo…

agradeço desde já

Certo. Abaixo está o novo modelo para preencher o jTable.


import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Marcos Arantes Júnior
 */
public class MkTableModel extends AbstractTableModel {

    private ArrayList linhas = null;
    private String[] colunas = null;

    public String[] getColunas() {
        return colunas;
    }

    public ArrayList getLinhas() {
        return linhas;
    }

    public void setColunas(String[] strings) {
        colunas = strings;
    }

    public void setLinhas(ArrayList list) {
        linhas = list;
    }

    /**
     * Retorna o numero de colunas no modelo
     * @see javax.swing.table.TableModel#getColumnCount()
     */
    public int getColumnCount() {
        return getColunas().length;
    }

    /**
     * Retorna o numero de linhas existentes no modelo
     * @see javax.swing.table.TableModel#getRowCount()
     */
    public int getRowCount() {
        return getLinhas().size();
    }
    /*Retorna o nome da coluna*/
//Usado paa mostra o nome nas colunas da jTable
    public String getColumnName(int col) {
        return colunas[col];
    }

    /**
     * Obtem o valor na linha e coluna
     * @see javax.swing.table.TableModel#getValueAt(int, int)
     */
    public Object getValueAt(int rowIndex, int columnIndex) {
        // Obtem a linha, que é uma String []
        String[] linha = (String[]) getLinhas().get(rowIndex);
//        // Retorna o objeto que esta na coluna
        return linha[columnIndex];

    }
//Alterar o conteúdo do modelo, tem que setar também o setValueAt
    private boolean[] colsEdicao;

    public boolean isCellEditable(int row, int col) {
        return colsEdicao[col];
//    return false;
    }

    /**
     * Seta o valor na linha e coluna
     * @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int)
     */
    public void setValueAt(Object value, int row, int col) {
        // Obtem a linha, que é uma String []
        String[] linha = (String[]) getLinhas().get(row);
        // Altera o conteudo no indice da coluna passado
        linha[col] = (String) value;
        // dispara o evento de celula alterada
        fireTableCellUpdated(row, col);

    }

     /**
    *Adiciona uma linha
    */
    public void addRow(String[] dadosLinha) {
        getLinhas().add(dadosLinha);
        // Informa a jtable de que houve linhas incluidas no modelo
        // COmo adicionamos no final, pegamos o tamanho total do modelo
        // menos 1 para obter a linha incluida.
        int linha = getLinhas().size() - 1;
        this.fireTableRowsInserted(linha, linha);
        return;
    }

     /**
    *Remove somente a linha selecionada
    */
    public void removeRow(int row) {
        getLinhas().remove(row);
        // informa a jtable que houve dados deletados passando a
        // linha removida
        fireTableRowsDeleted(row,row);
    }

     /**
    *Remove todas as linhas do modelo
    */
    public void removeAllRows(){
    getLinhas().removeAll(linhas);
     // informa a jtable que houve dados deletados passando a
        // linha removida
        fireTableDataChanged();
    }

    /**
     * Remove a linha pelo valor da coluna informada
     * @param val
     * @param col
     * @return
     */
    public boolean removeRow(String val, int col) {
        // obtem o iterator
        Iterator i = getLinhas().iterator();
        int linha = 0;
        // Faz um looping em cima das linhas
        while (i.hasNext()) {
            // Obtem as colunas da linha atual
            String[] linhaCorrente = (String[]) i.next();
            linha++;
            // compara o conteudo String da linha atual na coluna desejada
            // com o valor informado
            if (linhaCorrente[col].equals(val)) {
                getLinhas().remove(linha);
                // informa a jtable que houve dados deletados passando a
                // linha removida
                fireTableRowsDeleted(linha, linha);
                return true;
            }
        }
        // Nao encontrou nada
        return false;
    }

    /**
     * Pega o valor da linha e coluna, mesmo que não esteja presente na jTable
     */
    public Object getRow(int row,int coluna) {
        String[] linha = (String[]) getLinhas().get(row);
        return  linha[coluna];
    }
//Construtor que recebe os parâmetros
    public TableModel(ArrayList dados, String[] colunas, boolean[] edicao) {
        setLinhas(dados);
        setColunas(colunas);
        colsEdicao = edicao;
    }
}

Esse é o modelo.
Agora para colorir somente as linhas necessárias da jTable. Em ref, você coloca o valor. Pode pegar do modelo ou diretamente na jTable, como jTable1.getValueAt. O código abaixo você coloca depois de preencher a tabela.

      jTable1.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {

                this.setHorizontalAlignment(CENTER);
                Object ref = modelo.getValueAt(row, 0);

                if (ref != null && ref.equals("DISPONÍVEL")) {
                    setBackground(new Color(204, 204, 255));
                    setForeground(Color.blue);
                    jTable1.setFont(new Font("Tahoma", Font.BOLD, 12));
                }        
                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
        });

O filtro é o que já postei acima, newFilter. Está certo. O modelo da jTable que uso agora é esse mesmo que postei. Serve para qualquer um, sendo que não precisa criar uma classe do modelo pra cada um individualmente. Se tiver mais dúvidas, é só avisar. Já testei e tudo esta funcionando.

mto bom cara… valeu mesmo…

só mais uma duvidazinha que faz dias que nao consigo resolver…

da uma olhada no cód

[code] public void Obs()
{
Date datOBS = null;
String obs = “”;
DateFormat formatter = new SimpleDateFormat(“yyyy/MM/dd”);
try {
datOBS = new java.sql.Date(((java.util.Date) formatter.parse(d)).getTime());
} catch (ParseException ex) {
Logger.getLogger(consultaExtratos.class.getName()).log(Level.SEVERE, null, ex);
}
try {
obj_conexao.executeSQL("SELECT od.id_od,od.id_obs,od.dados,od.sel,od.data "
+"FROM OBS_DADOS od "
+“LEFT JOIN OBSERVACOES o ON od.id_obs = o.id_obs “
+“WHERE o.id_conta = “+LabelIdConta.getText()+” and od.id_obs = o.id_obs and '”+datOBS+”’ BETWEEN o.DATAI AND o.DATAF”);
while (obj_conexao.resultset.next()) {
String[] dados = new String[5];
dados[0] = obj_conexao.resultset.getString(“id_od”);
dados[1] = obj_conexao.resultset.getString(“id_obs”);
dados[2] = obj_conexao.resultset.getString(“dados”);
dados[3] = obj_conexao.resultset.getString(“sel”);
dados[4] = obj_conexao.resultset.getString(“data”);
.
//aqui deveria ter o tableModel.addRow(dados); porém nao consigo adicionar, pq? e nao aparece nada ao executar
}
}
catch (SQLException e) {
e.printStackTrace();
}

}  [/code]

mas nao consigo mostrar o addRow… e nao aparece nada na jtable. apenas os nomes das colunas

Para mostrar os dados, tem que inicializar o modelo primeiro. Voe não deve ter inicializado, aí não mostra nada. Para adicionar os dados, eu uso Arraylist porque a performance é melhor e no modelo é adicionado os dados usando um ArrayList.
Primeiro inicializa.

    private TableRowSorter<TableModel> sorter;
    private TableModel modelo;
    private ArrayList dados;
    private String[] colunas = new String[]{"Descrição",Total};
    private DB banco;

Agora sim preenche. Esse TableRowSorter é para filtrar os dados na coluna especificada. Eu não coloquei o código na coluna e vou te mostar porque.

dados = new ArrayList();
        banco = new DB();
        banco.connect();
        Query q = new Query(banco.conn);
        String sql = "SELECT codigo,descricao,total";
        q.open(sql);

        String codigo, descricao, total;
        //Inicializa as variáveis para conversão       
        try {
            while (q.next()) {
                codigo = q.fieldbyname("codigo");
                descricao = q.fieldbyname("data_2");
                total= q.fieldbyname("hora");

         //Aqui adiciona os dados a cada LOOP
        //Coloquei o campo codigo na última posição, e portanto não vai ser mostrado porque só tem 2 colunas definidas
        //Mas ele está no ArrayList e posso retornar o código usando modelo.getRow(linha,coluna) .      
                dados.add(new String[]{
                            descricao,total,codigo
                        });

            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao consultar \n"
                    + e.getMessage(), "Aviso", JOptionPane.WARNING_MESSAGE);
            //Imprime o erro completo
            e.printStackTrace();
        }
        banco.disconnect();

        //Só tem 3 campos e não vão ser editados
        boolean[] edicao = {false, false, false};
        modelo = new TableModel(dados, colunas, edicao);
        jTable1.setModel(modelo);
        sorter = new TableRowSorter<TableModel>(modelo);
        jTable1.setRowSorter(sorter);

Esse código acima, coloca em um evento do botão Todos ActionPerformed, para carregar todos os dados na jTable e depois no controle jTextField evento KeyReleased, coloque o código abaixo para pesquisar pela coluna desejada. Lembrando que se tem várias colunas e quiser pesquisar por mais de uma coluna, use um Case ou uma condicão e um jCombo ou a sua escolha e só vai mudando os índices. Aqui estou mostrando com um jCombo que tem duas opções de filtro: Descricao e Total, porque só tenho essa duas colunas sendo mostradas na jTable. txtConsulta é o nome da jTextField.

 switch (cbFiltro.getSelectedIndex()) {
                case 0:
                    //Descrição
                    newFilter2(0, txtConsulta.getText());
                    break;
                case 1:
                    //Total
                    newFilter(1, txtConsulta.getText());
                    break;   
}             

Coloque essa função abaixo que é para filtrar os dados. Esse “(?i)” é case sensitive e procura por qualquer ocorrência, se tirar não será mais case sensitive.

/**
     * Atualiza a expressão regular do filtro da linha da expressão
     * na caixa de texto. Filtra na jTable quando digita.
     */
    private void newFilter(int coluna, String texto) {
        RowFilter<TableModel, Object> rf = null;
        //If current expression doesn't parse, don't update.
        try {
            rf = RowFilter.regexFilter("(?i)" + texto, coluna);
        } catch (java.util.regex.PatternSyntaxException e) {
            return;
        }
        sorter.setRowFilter(rf);
    }

Esse é o exemplo. Siga as instruções acima e faça dessa maneira. Bem menor e mais fácil que o objectTableModel e é o filtro usado no exemplo da Oracle/SUN.

cara fiz o seguinte, o select ta pegando blz, o while tbm ta funcionando, mas ainda nao aparece nada na jtable

inicializei e tal:

private TableModel tableModel = new modelos.TableModel(); private ArrayList dados;

[code] public void Obs()
{
Date datOBS = null;
DateFormat formatter = new SimpleDateFormat(“yyyy/MM/dd”);
try {
datOBS = new java.sql.Date(((java.util.Date) formatter.parse(d)).getTime());
} catch (ParseException ex) {
Logger.getLogger(consultaExtratos.class.getName()).log(Level.SEVERE, null, ex);
}
try {
String observacao, sel;
obj_conexao.executeSQL("SELECT od.dados,od.sel "
+"FROM OBS_DADOS od "
+“LEFT JOIN OBSERVACOES o ON od.id_obs = o.id_obs “
+“WHERE o.id_conta = “+LabelIdConta.getText()+” and od.id_obs = o.id_obs and '”+datOBS+”’ BETWEEN o.DATAI AND o.DATAF”);
while (obj_conexao.resultset.next()) {
dados = new ArrayList();
observacao = obj_conexao.resultset.getString(“dados”);
sel = obj_conexao.resultset.getString(“sel”);
dados.add(new String[]{
observacao,sel});
}
}
catch (SQLException e) {
e.printStackTrace();
}

}[/code]

o que será que falta ainda?

valeu cara…

Copia e cola o erro que é impresso com o e.printStackTtrace para eu verificar. Assim eu posso te ajudar.

cara fiz da seguinte forma e deu qse certo… ta mostrando apenas o último registro

[code] public void Obs()
{
Date datOBS = null;
DateFormat formatter = new SimpleDateFormat(“yyyy/MM/dd”);
try {
datOBS = new java.sql.Date(((java.util.Date) formatter.parse(d)).getTime());
} catch (ParseException ex) {
Logger.getLogger(consultaExtratos.class.getName()).log(Level.SEVERE, null, ex);
}
try {
String observacao, sel;
obj_conexao.executeSQL("SELECT od.dados,od.sel "
+"FROM OBS_DADOS od "
+“LEFT JOIN OBSERVACOES o ON od.id_obs = o.id_obs “
+“WHERE o.id_conta = “+LabelIdConta.getText()+” and od.id_obs = o.id_obs and '”+datOBS+”’ BETWEEN o.DATAI AND o.DATAF”);
while (obj_conexao.resultset.next()) {
dados = new ArrayList();
observacao = obj_conexao.resultset.getString(“dados”);
sel = obj_conexao.resultset.getString(“sel”);
dados.add(new String[]{
observacao,sel});
}

            boolean[] edicao = {false, false, false};
            TableModel modelo = new modelos.TableModel(dados, colunas, edicao);
            TableObs.setModel(modelo);
            sorter = new TableRowSorter<TableModel>(modelo);
            TableObs.setRowSorter(sorter);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }

}[/code]

só que está mostrando apenas o último registro, em vez de aparecer todos…

deve ser um errinho pequeno…

cara consegui resolver o probleminha da seguinte forma, pra qm algum dia se encontrar nesse mesmo problema o codigo corrigido e funcionando abaixo:

[code]public void Obs()
{
Date datOBS = null;
DateFormat formatter = new SimpleDateFormat(“yyyy/MM/dd”);
try {
datOBS = new java.sql.Date(((java.util.Date) formatter.parse(d)).getTime());
} catch (ParseException ex) {
Logger.getLogger(consultaExtratos.class.getName()).log(Level.SEVERE, null, ex);
}
try {
String observacao, sel;
obj_conexao.executeSQL("SELECT od.dados,od.sel "
+"FROM OBS_DADOS od "
+“LEFT JOIN OBSERVACOES o ON od.id_obs = o.id_obs “
+“WHERE o.id_conta = “+LabelIdConta.getText()+” and od.id_obs = o.id_obs and '”+datOBS+”’ BETWEEN o.DATAI AND o.DATAF”);

            dados = new ArrayList(); //aqui tava o erro, ele estava dentro do WHILE, claro que sempre ia zerar, mostrando apenas o último registro, AGORA TA BLZ.

            while (obj_conexao.resultset.next()) {
                observacao = obj_conexao.resultset.getString("dados");
                sel = obj_conexao.resultset.getString("sel");
                dados.add(new String[]{
                observacao,sel});
            }

            boolean[] edicao = {false, false, false};
            TableModel modelo = new modelos.TableModel(dados, colunas, edicao);
            TableObs.setModel(modelo);
            sorter = new TableRowSorter<TableModel>(modelo);
            TableObs.setRowSorter(sorter);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }

}[/code]

cara, deu tudo blz, só tenho uma dúvida…

como faço pra pegar o id ao clicar na linha da jtable, mas nao qro que apareça esse id na jtable entende?

valeu cara

Do jeito que eu mostrei acima. Você nomeia as colunas criando um vetor normal. No nome das colunas não vai ter o nome código.

private String[] colunas = new String[]{"Descrição",Total};

Ao adicionar no ArrayList quando for fazer um LOOP no banco, coloca o código na última posição. Olhe o exemplo:

dados.add(new String[]{  
descricao,total,codigo  
                         });  

O exemplo acima vai exibir apenas a descrição e o total, se eu colocar somente esses 2 na coluna. O código está na última posição e isso oculta o código, porque ele só mostra as 2 colunas que eu coloquei, se eu colocasse 3, ele ia mostrar também o código.
Para pegar o código, faz o seguinte:

O problema é que se for nulo vai aparecer no campo null;
Então você pode tentar isso, que ele mostra vazio “” sem o null:

String[] campo = (String[]) modelo.getLinhas().get(jTable1.getSelectedRow());
//Agora eu pego o código, o índice começa do 0, então é o 2
//Usei o txtCodigo como nome do jTextField
txtCodigo.setText(campo[2]);

O modelo.getRow() pega também, mas use o último que te passei, porque ele não vai mostrar nulo e sim String vazia nos campos que forem nulos.

Outro problema, você colocou

boolean[] edicao = {false, false, false};

Colocou false para 3 campos e você só tem 2. Então fica

boolean[] edicao = {false,false};

Se for mostrado só uma coluna, mesmo adicionando 2 no ArrayList,

cara ta dando um errinho ao tentar buscar o ID

o getRow está dando “cannot find symbol”

e aqui

String[] campo = (String[]) mode.getLinhas().get(TableObs.getSelectedRow()); JTextField txtCodigo = new JTextField(); txtCodigo.setText(campo[2]);

ta dando erro no .getLinhas

valeu

Eu dei o exemplo considerando ter 3 campos, começando do 0. Se você só tem 2 campos sendo preenchidos no ArrayList quando faz o LOOP, então o índice vai ser 1. Só mude o índice de 2 para 1. Eu dei um exemplo baseado no meu para você entender.

String[] campo = (String[]) mode.getLinhas().get(TableObs.getSelectedRow());  
JTextField txtCodigo = new JTextField();  
txtCodigo.setText(campo[1]);  

OU

mode.getRow(TableObs.getValueAt(TableObs.getSelectedRow(),1).toString());  

Você deve ter se esquecido que você está usando 2 e começa do 0.

eu to usando 3 colunas

Object observacao, sel,id; obj_conexao.executeSQL("SELECT od.dados,od.sel,od.id_od " +"FROM OBS_DADOS od " +"LEFT JOIN OBSERVACOES o ON od.id_obs = o.id_obs " +"WHERE o.id_conta = "+LabelIdConta.getText()+" and od.id_obs = o.id_obs and '"+datOBS+"' BETWEEN o.DATAI AND o.DATAF"); dados = new ArrayList(); while (obj_conexao.resultset.next()) { observacao = obj_conexao.resultset.getString("dados"); // coluna 1 sel = obj_conexao.resultset.getBoolean("sel");// coluna 2 id = obj_conexao.resultset.getString("id_od");// coluna 3 dados.add(new Object[]{observacao,sel,id});

mas qro mostrar só a coluna 1 e 2

ai fiz assim:

boolean[] edicao = {false, true}; Object[][] obj = new Object[][]{{"",Boolean.class}}; String[] colunas = new String []{"Descrição","Sel"}; TableModel mode = new modelos.TableModel(dados, colunas, edicao) { Class[] types = new Class [] {java.lang.String.class,Boolean.class}; @Override public Class<?> getColumnClass(int column) {return types[column];} }; TableObs.setModel(mode); sorter = new TableRowSorter<TableModel>(mode); TableObs.setRowSorter(sorter); TableObs.getColumnModel().getColumn(1).setMaxWidth(25);

e deu certo!

só que na hora de buscar a id_od(pk) tento usar o código que tu me passou:

o cód “getRow” fica selecionado em vermelho, e o erro é “cannot find symbol”

entende?

valeu cara!

Não sei o que é esse erro, porque você tinha que copiar todo o erro que eu te disse. Todo o erro que aparece na saída da IDE. Eu uso o NetBeans e os erros aparecem todos lá. Eu vou verificar aqui, porque você está usando uns métodos diferentes aí fica difícil ver agora. Daqui a pouco vejo aqui.

Tentou assim:

String[] linha = (String[]) model.getLinhas().get(jTable1.getSelectedRow());
//Assim formata o código com 10 casas decimais, mesmo código usado no iRepor
//Só para estética mesmo
txtCodigo.setText(new java.lang.String(new java.text.DecimalFormat("0000000000").format(new java.lang.Double(linha[2]))));