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