Formatar uma jTable

Pessoal consigo alimentar a minha jTable com um select, até aí tudo blz. Agora pintou 3 dúvidas:
1ª) O nome das duas colunas saem com o nome do campo no banco, como eu faço para alterar esse nome?
2ª) O retorno do meu select é duas colunas agora como eu faço para a minha jTable ter 3 colunas onde as duas primeiras são alimentas pela select (o usuário não pode alterar) e a outra é um jCheckBox que pode ser editavel (selecionar) pelo usuário?
3ª)Como fazer as colunas geradas a partir do select sairem com largura já definida?
A minha jTable eu gerei no NetBeans 5 (usando matisse) e invoco ao click de um botão alguns métodos gerados por mim para alimentar essa jTable.
Olha os trechos do meu código:

//Método para carregar a jTable de dados da select    
   public void JTabela(ResultSet pStr){
      Grade.removeAll();
      try{     
           ResultSet rs = pStr;
           if (rs == null) return;
           ResultSetMetaData rsmd = rs.getMetaData();
           
           String[] col = new String[rsmd.getColumnCount()];
           for (int it = 0; it < rsmd.getColumnCount(); ++it)
                  col[it] = rsmd.getColumnLabel(it + 1);

           Vector vt = new Vector();
           while (rs.next())
           {
             Object[] row = new Object[rsmd.getColumnCount()];
             for (int it = 0; it < rsmd.getColumnCount(); it++)
               row[it] = this.getValue(rs, rsmd, it);
             vt.add(row);
           }
           Object[][] lin = (Object[][])vt.toArray(new Object[0][0]);
           Grade.setModel(new DefaultTableModel(lin,col));
           Grade.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);;
           for (int i=0;i < Grade.getColumnModel().getColumnCount();i++)
           {
             // Configurar o alinhamento das colunas
             //DefaultTableCellRenderer r = new DefaultTableCellRenderer();
             //r.setHorizontalAlignment(JLabel.RIGHT);
             //Grade.getColumnModel().getColumn(i).setCellRenderer(r);
               
             // Configurar o Tamanhos das Colunhas
             //Grade.getColumnModel().getColumn(i).setPreferredWidth(100*(i+1));
           }
           /*JCheckBox renderer = new JCheckBox();
           Grade.getColumnModel().getColumn(2).setCellRenderer(DefaultRenderer(renderer));*/
         }catch (SQLException sqle){
           JOptionPane.showMessageDialog(null,
                    "Impossível conectar com o Banco de Dados! Código do erro: " + sqle.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
         }
    }
   
   public Object getValue(ResultSet rs, ResultSetMetaData rsmd, int col) throws SQLException{
      if ((rsmd.getColumnType(col + 1) == Types.TIMESTAMP) ||
          (rsmd.getColumnType(col + 1) == Types.DATE)){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            try{
                Date dt = sdf.parse(rs.getString(col+1));
                sdf = new SimpleDateFormat("dd/MM/yyyy");
                return sdf.format(dt);
              }catch (ParseException pe){
                  return new String();
              }
          }
        return rs.getObject(col +1);
    }

Código do botão para invocar a carregar a jTable:

Conexao conexao2 = new Conexao();
        try {
            conexao2.conexao();
        } catch (FileNotFoundException fnfe) {
                JOptionPane.showMessageDialog(null,
                    "Arquivo do Banco de Dados não encontrado! Código do erro: " + fnfe.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        } catch (SQLException sqle) {
                JOptionPane.showMessageDialog(null,
                    "Impossível conectar com o Banco de Dados! Código do erro: " + sqle.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        } catch (IOException ioe) {
                JOptionPane.showMessageDialog(null,
                    "Exceção do tipo IOException gerada! Código do erro: " + ioe.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        } catch (ClassNotFoundException cnfe) {
                JOptionPane.showMessageDialog(null,
                    "Exceção do tipo ClassNotFoundException gerada! Código do erro: " + cnfe.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        }
        
        if (jCheckBoxTodos.isSelected() == true || jTextFieldConsulta.getText() != null){
            JOptionPane.showMessageDialog(null,
                    "Você não pode consultar TODOS com um parâmetro NOME digitado",
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        }
        
        if (jCheckBoxTodos.isSelected() == false || jTextFieldConsulta.getText() == null){
            JOptionPane.showMessageDialog(null,
                    "Você não pode executar a consulta sem um parâmetro!",
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        }
       
        if (jCheckBoxTodos.isSelected() == true){
            conexao2.setSelect("select e.cod_cli, e.razao_soc from bebwilson.clientes e"
                               + " where e.cod_cli = " + Main.jTextFieldConsulta.getText());
            conexao2.abrirbanco();
        
        try{
            ResultSet rs = conexao2.stm.executeQuery();
            JTabela(rs);
            
        }catch(SQLException sqle){
            JOptionPane.showMessageDialog(null,
                    "Impossível conectar com o Banco de Dados! Código do erro: " + sqle.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        }

        }else{
           conexao2.setSelect("select e.cod_cli, e.razao_soc from bebwilson.clientes e");     
           conexao2.abrirbanco();

           try{
               ResultSet rs = conexao2.stm.executeQuery();
               JTabela(rs);
               
           }catch (SQLException sqle){
               JOptionPane.showMessageDialog(null,
                    "Impossível conectar com o Banco de Dados! Código do erro: " + sqle.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
           }
           
        }

Não que eu queira ser referência absoluta para as dúvidas, mas já vi que não adiantou nada postar pra você os exemplos no outro post…
Com as classes que eu te apresentei lá dá pra fazer a maior parte disso que você precisa velho…

Pelo jeito você não gastou para ler a metade do tempo que eu gastei para escrever… e para quê

tem certas horas que me pergunto pq ainda importo tanto…

Olha sem querer fazer flame ou qualquer coisa do genero.

Não sei quanto tempo vc demorou para escrever o outro post mas eu gastei mais de 1 dia tentando implementar muita das coisas que vc passou, algumas funcionaram bem outras nem tanto, o resulto foi o código que postei nesse post.

Antes eu nem conseguia alimentar a jTable, agora já consigo. O fato é que não tenho tanta familiariade com Java em especial com o Swing, estou aprendendo ainda. Mas já fiz progressos.

[quote=petter]Olha sem querer fazer flame ou qualquer coisa do genero.

Não sei quanto tempo vc demorou para escrever o outro post mas eu gastei mais de 1 dia tentando implementar muita das coisas que vc passou, algumas funcionaram bem outras nem tanto, o resulto foi o código que postei nesse post.

Antes eu nem conseguia alimentar a jTable, agora já consigo. O fato é que não tenho tanta familiariade com Java em especial com o Swing, estou aprendendo ainda. Mas já fiz progressos.[/quote]

então tá valendo :smiley:

vou ver o q consigo por fazer pra te ajudar por aqui…

[]'s

Nesse trecho:

String[] col = new String[rsmd.getColumnCount()];
            for (int it = 0; it < rsmd.getColumnCount(); ++it)
                   col[it] = rsmd.getColumnLabel(it + 1);

você está montando um array com as sugestões de nome para as colunas.

se você sabe a quantidade certa de colunas (rsmd.getColumnCount() te dá a quantidade de colunas), e a ordem em que elas serão apresentadas, você pode montar um array manualmente e passar para o model de sua tabela:

supondo que rsmd.getColumnCount() = 2:

String[] col = {"Nome da Primeira Coluna", "Nome da Segunda Coluna"};

isso te resolve a primeira dúvida… :smiley:

Não entendi bem a 3ª dúvida? Sair já configurada de que maneira?

nesse trecho é onde você define a largura das colunas.

         //Grade.getColumnModel().getColumn(i).setPreferredWidth(100*(i+1));

Você pode tirar esse trecho do laço for e definir para cada coluna individualmente:

Grade.getColumnModel().getColumn(0).setPreferredWidth(100);
Grade.getColumnModel().getColumn(1).setPreferredWidth(50);

isso pode te resolver a 3ª dúvida …

Ahhh… antes que me esqueça… me desculpe pela maneira como respondi lá no início velho…
É que como vi que algumas coisas que você perguntou poderiam ter sido resolvidas com aqueles exemplos, achei que você nem tivesse se dado ao trabalho de ler e tentar implementar.

:thumbup:

Sussu.

Valeu pelas dicas vou fazer uns testes mas pelo que vi tá funcionando legal.

Eu devo tá muito errado mesmo.

Agora a minha select tá dando erro. Se eu passo algum parametro ele funciona legal (alimenta a jTable) contudo se eu faço um select do tipo select * from tabela retorna fim inesperado do comando SQL. Contudo se eu faço o select direto no meu banco (Oracle) ele funciona legal (retorna todos os 80.000 registros).
Olha o código do meu botão que dispara o select:

private void jButtonConsultarActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        Conexao conexao2 = new Conexao();
        try {
            conexao2.conexao();
        } catch (FileNotFoundException fnfe) {
                JOptionPane.showMessageDialog(null,
                    "Arquivo do Banco de Dados não encontrado! Código do erro: " + fnfe.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        } catch (SQLException sqle) {
                JOptionPane.showMessageDialog(null,
                    "Impossível conectar com o Banco de Dados! Código do erro: " + sqle.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        } catch (IOException ioe) {
                JOptionPane.showMessageDialog(null,
                    "Exceção do tipo IOException gerada! Código do erro: " + ioe.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        } catch (ClassNotFoundException cnfe) {
                JOptionPane.showMessageDialog(null,
                    "Exceção do tipo ClassNotFoundException gerada! Código do erro: " + cnfe.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        }
           
        if (jTextFieldConsulta.getText() != null){
            conexao2.setSelect("select e.cod_cli, e.razao_soc from bebwilson.clientes e"
                               + " where e.cod_cli = " + jTextFieldConsulta.getText());
            conexao2.abrirbanco();
        
        try{
            ResultSet rs = conexao2.stm.executeQuery();
            JTabela(rs);
            
        }catch(SQLException sqle){
            JOptionPane.showMessageDialog(null,
                    "Impossível conectar com o Banco de Dados! Código do erro: " + sqle.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
        }

        }
        if(jTextFieldConsulta.getText() == null){
           conexao2.setSelect("select e.cod_cli, e.razao_soc from bebwilson.clientes e");     
           conexao2.abrirbanco();

           try{
               ResultSet rs = conexao2.stm.executeQuery();
               JTabela(rs);
               
           }catch (SQLException sqle){
               JOptionPane.showMessageDialog(null,
                    "Impossível conectar com o Banco de Dados! Código do erro: " + sqle.toString(),
                    "Erro!",
                    JOptionPane.ERROR_MESSAGE);
           }
           
        }
        
//        conexao2.fecharbanco();
    }

é aqui q está dando erro?

if(jTextFieldConsulta.getText() == null){
            conexao2.setSelect("select e.cod_cli, e.razao_soc from bebwilson.clientes e");     
            conexao2.abrirbanco();
 
            try{
                ResultSet rs = conexao2.stm.executeQuery();
                JTabela(rs);
                
            }catch (SQLException sqle){
                JOptionPane.showMessageDialog(null,
                     "Impossível conectar com o Banco de Dados! Código do erro: " + sqle.toString(),
                     "Erro!",
                     JOptionPane.ERROR_MESSAGE);
            }
            
         }

onde você faz os testes, nos if’s…

if(jTextFieldConsulta.getText() == null)

tente substituir por isso:

if(jTextFieldConsulta.getText().equals(""))

e 

if(!jTextFieldConsulta.getText().equals(""))

Cara sua dica foi certeira. Eu era acostumado fazer um == null em outras linguagens e como equals() funcionou legal.

Só mais uma coisa, nessa minha jTable preciso imprimir as linhas que selecionei no meu jCheckBox, por exemplo, se eu selecionar 3 linhas pelo jCheckBox ele deve imprimir as 3 linhas ao pressionar o meu botão (nesse caso tem como eu pegar o número da linha?).

Já tenho a rotina para o meu impressor de códigos de barras funcionando blz. Minha dúvida é como capturar quais as linhas estão com o jCheckBox selecionado.

Consegui pegar o index da linha editada da seguinte forma:

for (int linhas = 0; linhas < Grade.getEditingRow(); linhas++){
            
        }

Se não estiver errado esse laço for vai percorrer todos as linhas editadas (selecionadas) a minha dúvida é como pegar o conteudo desses células editadas, onde cada campo (coluna) da linha eu possa atribuir a uma variável. Tem como?

Opa…

Não respondi ontem pois uma enxaqueca me tirou do jogo :smiley:

Vamos lá…

Tente o seguinte:

Digamos que você queira somente a segunda coluna da JTable, para as linhas selecionadas, e que o valor nesta segunda coluna é uma String.

// pega uma referência ao TableModel da sua JTable, que é onde estão os dados...
DefaultTableModel m = Grade.getModel();

// irá quardar os valores das colunas...
List<String> valores = new ArrayList<String>();

// passa por cada linha da JTable...
for(int index = 0; index < m.getRowCount(); index++){

   // digamos que a coluna que tem o JCheckBox seja a primeira...
   // o valor de um JCheckBox é representado (até onde eu sei) por um valor
   // booleano (true=selecionado)
   // vamos ver se o valor da primeira coluna é true, e se for guardamos o valor
   // que está na segunda coluna


   if((Boolean)m.getValueAt(index, 0)){
      
      // guarda o valor da segunda coluna...
      valores.add(m.getValueAt(index, 1));
   }
 
}

ao sair daqui, se tudo der certo :smiley: “values” terá todos os valores as segundas células das linhas selecionadas.

para percorrer “values” e imprimir os valores - suponha que exista um método imprimir(String s) - faça o seguinte:

for(String s : valores){

   imprimir(s);
}

qualquer coisa estamos aí…

[]'s

Fala…

Só voltei pro Java hoje pela manhã. Tava fazendo um ponta de Webdesigner.

O seguinte estava tentando implementar o seu código e ainda dá um erro (fiz algumas alterações conforme a minha necessidade).

    private void jButtonImprimirActionPerformed(java.awt.event.ActionEvent evt) {                                                
 // pega uma referência ao TableModel da sua JTable, que é onde estão os dados...
//Aqui retirei o Default pois dava erro
 TableModel model = Grade.getModel();
 
 // irá quardar os valores das colunas...
//Preciso guardar o valor de duas colunas, por isso inclui mais 1
 List<String> valores1 = new ArrayList<String>();
 List<String> valores2 = new ArrayList<String>();
 
 // passa por cada linha da JTable...
 for(int index = 0; index < model.getRowCount(); index++){
    if((Boolean)model.getValueAt(index, 0)){
       //guarda o valor da primeira coluna...

/*Dá um erro de canot find symbol
   Symbol: method add(java.lang.Object)
   Location: interface java.util.list<java.lang.String>
  O erro ocorre nas duas linhas abaixo.*/

       valores1.add(model.getValueAt(index, 0));
       // guarda o valor da segunda coluna...
       valores2.add(model.getValueAt(index, 1));
    }
 }
 
 //Aqui virá a minha rotina de impressão.
imprimir(String, String);
    }

Outro erro, a minha rotina de imprimir recebe duas Strings e está com conflito pois está recebendo List, tentei mudar usando toString mas o erro persiste. Olha o código:

for(String s : valores1){
    valores1.toString();
    valores2.toString();
    imprimir.main(valores1, valores2);
 }

Cara eu também tenho enxaqueca, quando ataca é brabo, não dá nem animo para sair da cama. Melhoras !!!

Opa… valeu

Já tô melhor… deu até pra jogar um bilhar e tomar umas esse final de semana :smiley:

mas vamos lá…

tente fazer o seguinte onde dá erro:

valores1.add((String)model.getValueAt(index, 0));
valores2.add((String)model.getValueAt(index, 1));

Aqui, se você fosse imprimir apenas uma String funcionaria assim:

for(String s : valores1){

     imprimir.main(s);
}

mas como são duas, faça o seguinte:

// já que a quantidade de itens em valores1 e valores2 é a mesma, obtenho a quantidade a partir de um só

for(int index = 0; index < valores1.size(); index++){

     imprimir.main(valores1.get(index), valores2.get(index));
}

qualquer coisa poste aí…

[]'s

Cara o código agora compila, mas quando eu aciono o botão de imprimir dá a seguinte exceção:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.math.BigDecimal

E não imprime nada. Achei estranho pois acusa java.math.BigDecimal e estou usando somente Strings.

:shock:

Tava reparando o seguinte (não que seja a solução apra esse erro).

Se a sua primeira coluna tem um boolean (checkbox), então você não pode pegar o valor dela, tem que ser os valores da segunda e terceira colunas:

valores1.add((String)model.getValueAt(index, 1));
valores2.add((String)model.getValueAt(index, 2));

dá uma olhada nisso… se possível indique em que local o código dispara a Exception…

[]s

Bem a minha coluna com o boolean é a terceira.

Pelo que vi aqui a exception é disparada nesse trecho do código:

    if((Boolean)model.getValueAt(index, 0)){

Achei esse erro, troquei o 0 por 2. Agora dá a mesma exception na linha:

valores1.add((String)model.getValueAt(index, 0));

Esse negócio tá sinistro. :lol: