Criar jtable sem sem saber a qtd de colunas e inserir jcombobox no jtable
12 respostas
F
filipaum90
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.
E
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.
F
filipaum90
É 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
filipaum90
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.
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
filipaum90
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
filipaum90
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!!!
packagepesquisaflorestal;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.util.ArrayList;importjava.util.List;importjava.util.Vector;importjavax.swing.DefaultCellEditor;importjavax.swing.JComboBox;importjavax.swing.JTable;importjavax.swing.table.AbstractTableModel;importjavax.swing.table.DefaultTableCellRenderer;importjavax.swing.table.TableColumn;/** * * @author Filipe */publicclassParcelaTableModel2extendsAbstractTableModel{privateList<String>cabecalho=newArrayList();privateList<List><Object>>linhas=newArrayList();privateList<Class>classes=newArrayList();privateList<Object>celulas=newArrayList();publicParcelaTableModel2(ArrayList<String>cabecalho,ArrayList<Class>classes){if(cabecalho.size()!=classes.size()){thrownewIllegalArgumentException("Quantidade de colunas diferente da quantidade de classes.");}this.cabecalho=(List<String>)cabecalho.clone();this.classes=(List<Class>)classes.clone();}publicStringgetColumnName(intcol){returncabecalho.get(col);}publicintgetRowCount(){returnlinhas.size();}publicintgetColumnCount(){returncabecalho.size();}publicObjectgetValueAt(introw,intcol){returnlinhas.get(row).get(col);}publicClassgetColumnClass(intcol){returnclasses.get(col);}publicvoidsetSubnivColumn(JTabletable,TableColumnsubnivColumn,intcolumn){//Set up the editor for the sport cells.JComboBoxcomboBox=newJComboBox();Vectorh=newVector();Vectors=newVector();Vectorw=newVector();Vector<Vector>combo=newVector<Vector>();inttemp=0;Stringdriver="com.mysql.jdbc.Driver";//Classe do driver JDBCStringbanco="soft_pesq_florestal";//Nome do Banco criadoStringhost="localhost";//Maquina onde está o bancoStringstr_conn="jdbc:mysql://"+host+":3306/"+banco;//URL de conexãoStringusuario="root";//Usuário do bancoStringsenha="31101964";//Senha de conexão Connectionconn=null;try{Class.forName(driver);conn=DriverManager.getConnection(str_conn,usuario,senha);}catch(Exceptione){e.printStackTrace();thrownewjava.lang.RuntimeException("erro ao conectar");}Stringquery1="SELECT * FROM Tratamentos";ArrayList<Integer>qtd_sub=newArrayList<Integer>();//h.add("Parcela");try{java.sql.Statementstmt1=conn.createStatement();ResultSetrs1=stmt1.executeQuery(query1);while(rs1.next()){h.add(rs1.getString("tratamentosname"));qtd_sub.add(rs1.getInt("qtd_subniveis"));}}catch(java.sql.SQLExceptione){thrownewjava.lang.RuntimeException(e.getMessage());}try{conn.close();}catch(Exceptione){e.printStackTrace();thrownewjava.lang.RuntimeException("erro ao conectar");}conn=null;try{Class.forName(driver);conn=DriverManager.getConnection(str_conn,usuario,senha);}catch(Exceptione){e.printStackTrace();thrownewjava.lang.RuntimeException("erro ao conectar");}Stringquery2="SELECT * FROM Subniveis";try{java.sql.Statementstmt2=conn.createStatement();ResultSetrs2=stmt2.executeQuery(query2);while(rs2.next()){s.add(rs2.getString("subniveisname"));}}catch(java.sql.SQLExceptione){thrownewjava.lang.RuntimeException(e.getMessage());}try{conn.close();}catch(Exceptione){e.printStackTrace();thrownewjava.lang.RuntimeException("erro ao conectar");}intb=0;for(intk=0;k<qtd_sub.size();k++){w=newVector();for(inta=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=newJComboBox(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(newDefaultCellEditor(comboBox));fireTableCellUpdated(1,column);//Set up tool tips for the sport cells.DefaultTableCellRendererrenderer=newDefaultTableCellRenderer();renderer.setToolTipText("Click for combo box");subnivColumn.setCellRenderer(renderer);}publicvoidaddRow(ArrayList<?extendsObject>valores){if(valores.size()!=cabecalho.size()){thrownewIllegalArgumentException("Quantidade de valores diferente da quantidade de colunas.");}for(intcoluna=0;coluna<valores.size();coluna++){validar(coluna,valores.get(coluna));}ArrayList<Object>linha=newArrayList();for(Objectvalor:valores){linha.add(valor);}linhas.add(linha);fireTableDataChanged();}publicvoidaddColumn(Stringtitulo,Classclasse){//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(ReflectiveOperationExceptionex){thrownewIllegalArgumentException("Nao foi possivel instanciar a classe "+classe.getName());}}fireTableStructureChanged();}//cria uma coluna com valor default publicvoidaddColumn(Stringtitulo,Classclasse,ObjectvalorDefault){//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();}publicbooleanisCellEditable(introwIndex,intcolumnIndex){//no nosso caso todas vão ser editáveis, entao retorna true pra todasif(columnIndex>=1){returntrue;}else{returnfalse;}}privatevoidvalidar(intcol,Objectvalor){if(!valor.getClass().equals(classes.get(col))){thrownewIllegalArgumentException("Valor na coluna "+col+" deve ser do tipo "+classes.get(col).toString());}}}
F
filipaum90
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
filipaum90
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