Criar jtable sem sem saber a qtd de colunas e inserir jcombobox no jtable

GALERAA!! URGENTE PRECISO DE AJUDA!

ESTOU PRECISANDO CRIAR UMA JTABLE EM QUE NÃO SEI A QTD DE COLUNAS E NEM A DE LINHAS, OU SEJA, O USUÁRIO QUE IRÁ DIGITAR. E NESSAS COLUNAS, A PRIMEIRA TERÁ A SEQUENCIA DE Nº ( DE 1 A N LINHAS) E OS JCOMBOBOX TEM QUE APARECER A PARTIR DA SEGUNDA COLUNA. NÃO ESTOU ACERTANDO INSERIR NO ABSTRACT TABLE MODEL DE JEITO NENHUM… ME AJUDEM POR FAVOR!!!

Hum, num caso desses (onde a quantidade de colunas é indefinida) você não pode usar uma DefaultTableModel. Isso é porque o DefaultTableModel começa com um array ou Vector de colunas, e depois você não pode adicionar mais colunas.

Infelizmente, sr. Felipão, você vai ter de criar seu TableModel (até porque você tem um complicador, que é o JComboBox em uma das colunas). Você poderia tentar usar o GlazedLists mas esse pacote também supõe que o número de colunas é fixo.

Com número de colunas ilimitado (não é que você pode simplesmente esconder as que você não quer ver. certo?) você vai ter de estudar um pouco como é que se constrói um TableModel.

É O SEGUINTE: É QUE ESTA QUANTIDADE DE LINHAS E COLUNAS TEM COMO EU SABER, POIS OS NOMES DAS LINHAS (1ª COLUNA) E OS NOMES DAS COLUNAS EU ARMAZENO EM BD… TALVEZ POSSA FICAR MAIS FÁCIL. O PROBLEMA MAIOR É QUE NÃO CONSIGO JOGAR O JCOMBOBOX NO TABLE, OU SEJA, A PARTIR DA SEGUNDA COLUNA, TENHO Q INSERIR UM COMBOBOX DIFERENTE PARA CADA COLUNA.

VE SE TEM UMA SOLUÇÃO AEE NA BOA!

VALEU

[quote=entanglement]Infelizmente, sr. Felipão, você vai ter de criar seu TableModel (até porque você tem um complicador, que é o JComboBox em uma das colunas). Você poderia tentar usar o GlazedLists mas esse pacote também supõe que o número de colunas é fixo.

Com número de colunas ilimitado (não é que você pode simplesmente esconder as que você não quer ver. certo?) você vai ter de estudar um pouco como é que se constrói um TableModel. [/quote]

É O SEGUINTE: É QUE ESTA QUANTIDADE DE LINHAS E COLUNAS TEM COMO EU SABER, POIS OS NOMES DAS LINHAS (1ª COLUNA) E OS NOMES DAS COLUNAS EU ARMAZENO EM BD… TALVEZ POSSA FICAR MAIS FÁCIL. O PROBLEMA MAIOR É QUE NÃO CONSIGO JOGAR O JCOMBOBOX NO TABLE, OU SEJA, A PARTIR DA SEGUNDA COLUNA, TENHO Q INSERIR UM COMBOBOX DIFERENTE PARA CADA COLUNA.

VE SE TEM UMA SOLUÇÃO AEE NA BOA!

VALEU

Bom, a solução “na boa” que posso lhe dar é esta aqui:
http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

[quote=entanglement]Bom, a solução “na boa” que posso lhe dar é esta aqui:
http://docs.oracle.com/javase/tutorial/uiswing/components/table.html[/quote]

Cara… tava olhando esta página agora…

Mas acho que vou ter que apelar para DefaultTableModel… mas neste tem uma dificuldade tbm… preciso de inserir um tipo de ComboBox em cada Coluna a partir da segunda…

Sabe como faz isso?

valeu

Não use o DefaultTableModel.

Leia o link do lado do texto em vermelho em minha assinatura.

Além disso, NÃO POSTE COM CAPS LOCK LIGADO. ALÉM DE PIORAR A LEITURA PARECE QUE VC TÁ GRITANDO.

[quote=ViniGodoy]Não use o DefaultTableModel.

Leia o link do lado do texto em vermelho em minha assinatura.

Além disso, NÃO POSTE COM CAPS LOCK LIGADO. ALÉM DE PIORAR A LEITURA PARECE QUE VC TÁ GRITANDO.[/quote]

Me perdoe ViniGodoy, mas é desesperador… kkk

Acho que só vc pode me dar uma ajuda com relação a isso…

Estou tentando fazer o procedimento tem quase 1 mês e nada… to desanimando já!! (leia o primeiro post)

Veja aí e me dê um retorno, por favor!!

Valeu

[quote=ViniGodoy]Não use o DefaultTableModel.

Leia o link do lado do texto em vermelho em minha assinatura.

Além disso, NÃO POSTE COM CAPS LOCK LIGADO. ALÉM DE PIORAR A LEITURA PARECE QUE VC TÁ GRITANDO.[/quote]

Cara… to quase conseguindo fazer o que eu queria… O problema agora é que quando seleciono o item no combobox, ele não sobrescreve o item que estava selecionado anteriormente. Segue o print da tela e o código do ParcelaTableModel.java . Me dê uma ajuda aee por favor!!!

package pesquisaflorestal;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;

/**
 *
 * @author Filipe
 */
public class ParcelaTableModel2 extends AbstractTableModel {

    private List<String> cabecalho = new ArrayList();
    private List<List><Object>> linhas = new ArrayList();
    private List<Class> classes = new ArrayList();
    private List<Object> celulas =  new ArrayList();

    public ParcelaTableModel2(ArrayList<String> cabecalho, ArrayList<Class> classes) {
        if (cabecalho.size() != classes.size()) {
            throw new IllegalArgumentException("Quantidade de colunas diferente da quantidade de classes.");
        }
        this.cabecalho = (List<String>) cabecalho.clone();
        this.classes = (List<Class>) classes.clone();
    }

    public String getColumnName(int col) {
        return cabecalho.get(col);
    }

    public int getRowCount() {
        return linhas.size();
    }

    public int getColumnCount() {
        return cabecalho.size();
    }

    public Object getValueAt(int row, int col) {
        return linhas.get(row).get(col);
    }     
    public Class getColumnClass(int col) {
        return classes.get(col);
    }
    public void setSubnivColumn(JTable table, TableColumn subnivColumn, int column) {
        //Set up the editor for the sport cells.
        JComboBox comboBox = new JComboBox();
        Vector h = new Vector();
        Vector s = new Vector();
        Vector w = new Vector();
        Vector<Vector> combo = new Vector<Vector>();
        int temp = 0;
        String driver = "com.mysql.jdbc.Driver"; //Classe do driver JDBC
        String banco = "soft_pesq_florestal"; //Nome do Banco criado
        String host = "localhost"; //Maquina onde está o banco
        String str_conn = "jdbc:mysql://" + host + ":3306/" + banco; //URL de conexão
        String usuario = "root"; //Usuário do banco
        String senha = "31101964"; //Senha de conexão   
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(str_conn, usuario, senha);
        } catch (Exception e) {
            e.printStackTrace();
            throw new java.lang.RuntimeException("erro ao conectar");
        }
        String query1 = "SELECT * FROM Tratamentos";
        ArrayList<Integer> qtd_sub = new ArrayList<Integer>();
        //h.add("Parcela");
        try {
            java.sql.Statement stmt1 = conn.createStatement();
            ResultSet rs1 = stmt1.executeQuery(query1);
            while (rs1.next()) {
                h.add(rs1.getString("tratamentosname"));
                qtd_sub.add(rs1.getInt("qtd_subniveis"));
            }

        } catch (java.sql.SQLException e) {
            throw new java.lang.RuntimeException(e.getMessage());
        }
        try {
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new java.lang.RuntimeException("erro ao conectar");
        }
        conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(str_conn, usuario, senha);
        } catch (Exception e) {
            e.printStackTrace();
            throw new java.lang.RuntimeException("erro ao conectar");
        }
        String query2 = "SELECT * FROM Subniveis";
        try {
            java.sql.Statement stmt2 = conn.createStatement();
            ResultSet rs2 = stmt2.executeQuery(query2);
            while (rs2.next()) {
                s.add(rs2.getString("subniveisname"));
            }

        } catch (java.sql.SQLException e) {
            throw new java.lang.RuntimeException(e.getMessage());
        }
        try {
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new java.lang.RuntimeException("erro ao conectar");
        }
        int b = 0;
        for (int k = 0; k < qtd_sub.size(); k++) {
            w = new Vector();
            for (int a = 0; a < qtd_sub.get(k); a++) {
                //a = Integer.parseInt(modelSubnivTrat.getValueAt(s, 1).toString());
                //if (s < subnivTrat.get(k)) {
                w.add(s.get(b++).toString());
                //}
            }
            combo.add(w);
        }

        comboBox = new JComboBox(combo.get(column - 1));
        /*comboBox.addItem("Snowboarding");
         comboBox.addItem("Rowing");
         comboBox.addItem("Knitting");
         comboBox.addItem("Speed reading");
         comboBox.addItem("Pool");
         comboBox.addItem("None of the above");*/
        subnivColumn.setCellEditor(new DefaultCellEditor(comboBox));
        fireTableCellUpdated(1, column);

        //Set up tool tips for the sport cells.
        DefaultTableCellRenderer renderer =
                new DefaultTableCellRenderer();
        renderer.setToolTipText("Click for combo box");
        subnivColumn.setCellRenderer(renderer);
    }

    public void addRow(ArrayList<? extends Object> valores) {
        if (valores.size() != cabecalho.size()) {
            throw new IllegalArgumentException("Quantidade de valores diferente da quantidade de colunas.");
        }
        for (int coluna = 0; coluna < valores.size(); coluna++) {
            validar(coluna, valores.get(coluna));
        }
        ArrayList<Object> linha = new ArrayList();
        for (Object valor : valores) {
            linha.add(valor);
        }
        linhas.add(linha);
        fireTableDataChanged();
    }

    public void addColumn(String titulo, Class classe) {
        //adiciono a nova coluna no cabecalho  
        cabecalho.add(titulo);

        //adiciono a classe da nova coluna  
        classes.add(classe);

        //adiciono os valores da nova coluna em cada linha  
        for (List<Object> valores : linhas) {
            try {
                valores.add(classe.newInstance());
            } catch (ReflectiveOperationException ex) {
                throw new IllegalArgumentException("Nao foi possivel instanciar a classe " + classe.getName());
            }
        }
        fireTableStructureChanged();
    }

    //cria uma coluna com valor default  
    public void addColumn(String titulo, Class classe, Object valorDefault) {
        //adiciono a nova coluna no cabecalho  
        cabecalho.add(titulo);

        //adiciono a classe da nova coluna  
        classes.add(classe);

        //adiciono os valores da nova coluna em cada linha  
        for (List<Object> valores : linhas) {
            valores.add(valorDefault);
        }
        fireTableStructureChanged();
    }

    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //no nosso caso todas vão ser editáveis, entao retorna true pra todas
        if (columnIndex >= 1) {
            return true;
        } else {
            return false;
        }
    }
    private void validar(int col, Object valor) {
        if (!valor.getClass().equals(classes.get(col))) {
            throw new IllegalArgumentException("Valor na coluna " + col
                    + " deve ser do tipo " + classes.get(col).toString());
        }
    }
}

RESOLVIDOO…
CONSEGUI RESOLVER…
É SÓ CRIAR UMA FUNÇÃO SETDADOS…

Posta a soluçao e cara… por favor, desliga a porcaria do caps lock.

Só fiz inserir a função setValueAt(), pois fui pegando um pouco de um exemplo e um pouco de outro, juntei tudo e deu certo. E no final faltou só o item da ComboBox ser selecionado.

A solução foi essa:

public void setValueAt(Object aValue, int rowIndex, int columnIndex) { //pega o produto da linha List<Object> o =linhas.get(rowIndex); //verifica qual valor vai ser alterado if (columnIndex == 0) { o.set(columnIndex, Integer.parseInt(aValue.toString())); } else{ o.set(columnIndex, aValue.toString()); } //avisa que os dados mudaram fireTableDataChanged(); }

Valeu ViniGodoy…

Tópico Resolvido!!!

P.S.: Pode deixar que meu “CAPS LOCK” só vai ficar desligado agora… rsrs