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

12 respostas
F

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!!!

12 Respostas

E

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.

E

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.

F

É 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

F

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.

É 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

E

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

F

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

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

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.

F

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.

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

F

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.

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());
        }
    }
}
F

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

ViniGodoy

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

F

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

Criado 3 de maio de 2013
Ultima resposta 9 de mai. de 2013
Respostas 12
Participantes 3