Como pegar todos valores de uma linha de meu TableModel?

30 respostas
paulinhohd

Galera, mais uma dúvida sobre TableModel:

Olhem meu Model:

public class SimpleTableModel extends AbstractTableModel{

	    private ArrayList linhas = null;
	    private String [] colunas = null;
	    public String[] getColunas() {return colunas;}
	    public ArrayList getLinhas() {return linhas;}
	    public void setColunas(String[] strings) {colunas = strings;}
	    public void setLinhas(ArrayList list) {linhas = list;}
	    
	
	public int getColumnCount() {return getColunas().length;}
	
	public int getRowCount() {return getLinhas().size();}
	
	public Object getValueAt(int rowIndex, int columnIndex) {
	    // Obtem a linha, que é uma String []
	    String [] linha = (String [])getLinhas().get(rowIndex);
	    // Retorna o objeto que esta na coluna
	    return linha[columnIndex];
	}

	public SimpleTableModel(ArrayList dados, String[] colunas, boolean [] edicao){
	    setLinhas(dados);
	    setColunas(colunas);
	    colsEdicao = edicao;
	}
	private boolean [] colsEdicao;
	public boolean isCellEditable(int row, int col){
	    return colsEdicao[col];
	}
		
	public void setValueAt(Object value, int row, int col){
	    // Obtem a linha, que é uma String []
	    String [] linha = (String [])getLinhas().get(row);
	    // Altera o conteudo no indice da coluna passado
	    linha[col] = (String)value;
	    // dispara o evento de celula alterada
	    fireTableCellUpdated(row,col);
	}
		public void addRow( String [] dadosLinha){
	    getLinhas().add(dadosLinha);
	    // Informa a jtable de que houve linhas incluidas no modelo
	    // COmo adicionamos no final, pegamos o tamanho total do modelo
	    // menos 1 para obter a linha incluida.
	    int linha = getLinhas().size()-1;
	    fireTableRowsInserted(linha,linha);
	    return;
	}
	public void removeRow(int row){
	    getLinhas().remove(0);
	    // informa a jtable que houve dados deletados passando a 
	    // linha reovida
	    fireTableRowsDeleted(row,row);
	}

	public boolean removeRow(String val, int col){
	    // obtem o iterator
	    Iterator i = getLinhas().iterator();
	    int linha = 0;
	    // Faz um looping em cima das linhas
	    while(i.hasNext()){
	        // Obtem as colunas da linha atual
	        String[] linhaCorrente = (String[])i.next();
	        linha++;
	        // compara o conteudo String da linha atual na coluna desejada
	        // com o valor informado
	        if( linhaCorrente[col].equals(val) ){
	            getLinhas().remove(linha);
	            // informa a jtable que houve dados deletados passando a 
	            // linha removida
	            fireTableRowsDeleted(linha,linha);
	            return true;                
	        }
	    }
	    // Nao encontrou nada
	    return false;
	}
	}

Em minha tabela, existem 3 colunas, quero saber como fazer para pegar os dados que o usuáro irá digitar nelas.

Utilizando o:
modelo.getValueAt(0,0);
eu consigo pegar o primeiro valor da primeira linha, não tem como pegar os dados da linha inteira? Pois estou fazendo um:
String InstrucaoSQL = "INSERT INTO Tab_PedItem VALUES ('" + dados + "')";
			        FluxoSQL.executeUpdate(InstrucaoSQL);
				 	FluxoSQL.close();
queria fazer com que a váriavel dados recebesse pelo menos todos dados da primeira linha, de todas colunas, para inserir um registro só no banco.

Se alguém puder ajudar... 8)

30 Respostas

brlima

Ué, porque não implementa um método getValueAT onde vc só recebe a linha e retorna um array de String ? Vc tem tudo na mão pra fazer isso…rsss… :mrgreen:

public String [] getValueAt(int row){
    // Obtem a linha, que é uma String []
    String [] linha = (String [])getLinhas().get(rowIndex);
    // Retorna o objeto que esta na linha
    return linha;
}
danieldestro

paulinhohd, parece que não serviu de nada o exemplo que mostrei para você (http://www.guj.com.br/posts/list/0/23576.java#125959), né.

Porque não usou um objeto com os dados ao invés de mandar um array de Strings? Isso te facilitaria a vida.

Além do que, mesmo usando o seu table model, você pode criar um método:

public String[] getValoresLinha( int row ) { return (String [])getLinhas().get(rowIndex); }

NoodleZ

paulinhuHD tah virando o padawan java TableModel do Forum :wink: :lol: :lol: :lol: :lol:

paulinhohd

Huahuahu pode crê…

Daniel, fazendo como o brlima falou tb dá certo, eu pegar um Array String eu tb estarei pegando todos os campos, creio que agora seja só setar os campos.

Valeu! 8)

danieldestro

O que você acha mais adequeado, coeso, fácil:

String[] valores = model.getValores( 1 ); String sql = "INSERT INTO A VALUE(?,?)"; ps.setString( 1, valores[0] ); ps.setInt( 2, Integer.parseInt(valores[1]) );

ou

Pessoa p = model.getValores( 1 ); String sql = "INSERT INTO A VALUE(?,?)"; ps.setString( 1, p.getNome() ); ps.setInt( 2, p.getIdade() );

brlima

ou

String sql = model.getInsertStatement( 1, Pessoa.class );

:mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

paulinhohd

Daniel, de acorodo com meu códio, achei mais fácil utilizar um array de String mesmo:

O Problema é o seguinte agora, vejam o código:

try{			
					Conexao conn = new Conexao();										
					Statement FluxoSQL = conn.conexao.createStatement();
					SimpleTableModel modelo = new SimpleTableModel(dados,colunas,edicao);
					JOptionPane.showMessageDialog(null,modelo.getValor(0));
					String[] teste = modelo.getValor(0);
					JOptionPane.showMessageDialog(null,"INSERT INTO Tab_PedItem VALUES (?,?,?,?)");
					ps1 = conne.prepareStatement("INSERT INTO Tab_PedItem VALUES (?,?,?,?)");
					ps1.setInt(2,Integer.parseInt(teste[0]));
					ps1.setInt(3,Integer.parseInt(teste[1]));
					ps1.setInt(4,Integer.parseInt(teste[2]));
					ps1.executeUpdate();
				 	FluxoSQL.close();
					}
				
				catch(Exception ex){
					System.err.println("Erro no acesso ao banco de dados !");
			 		}

Estou pegando o valor certinho, já até jogeui em um JOptionPane e ele me mostra corretamente o que eu editei, porém, não insere no banco por nada.

A váriável conne
ps1 = conne.prepareStatement("INSERT INTO Tab_PedItem VALUES (?,?,?,?)");
está global,e do tipo Connection em meu prog. e tenho uma classe pool de conexão que tá funcionando blz.

E em meu banco, a tabela Tab_PedItem só tem estas quatro colunas, que são todas do tipo inteiro.

Não sei o porque de não inserir, será que alguém pode me ajudar? :lol:

Valeu! 8)

S

ps1.setInt(2,Integer.parseInt(teste[0])); ps1.setInt(3,Integer.parseInt(teste[1])); ps1.setInt(4,Integer.parseInt(teste[2]));

Aqui vc tem 3 valores. Será que não falta a quarta “?”:

brlima

concordo. :mrgreen:

paulinhohd

Foi, mal, é que apaguei quando estava apagando meus comentários, porém mesmo assim não insere! :roll:

brlima

tem exception ? deve ter sim. Tenta pegar…

paulinhohd

Como assim exception? Não entendi :lol:

brlima
try{			
 					Conexao conn = new Conexao();										
 					Statement FluxoSQL = conn.conexao.createStatement();
 					SimpleTableModel modelo = new SimpleTableModel(dados,colunas,edicao);
 					JOptionPane.showMessageDialog(null,modelo.getValor(0));
 					String[] teste = modelo.getValor(0);
 					JOptionPane.showMessageDialog(null,"INSERT INTO Tab_PedItem VALUES (?,?,?,?)");
 					ps1 = conne.prepareStatement("INSERT INTO Tab_PedItem VALUES (?,?,?,?)");
 					ps1.setInt(2,Integer.parseInt(teste[0]));
 					ps1.setInt(3,Integer.parseInt(teste[1]));
 					ps1.setInt(4,Integer.parseInt(teste[2]));
 					ps1.executeUpdate();
 				 	FluxoSQL.close();
 					}
 				
 				catch(Exception ex){
 					System.err.println("Opa! Exception no ar! !");
                                        ex.printStackTrace();
 			 		}

Agora ele vai imprimir a excessao na saida :smiley: ai vc pega ela e ve que erro tá dando!

paulinhohd

olha o erro ae hauhua:

java.lang.NullPointerException at Principal$6.actionPerformed(Principal.java:293) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)
Se eu não em engano este erro é de variável nula?? :?:

brlima

exato! Ve ai que linha é a 293. O erro ta lá.

paulinhohd

Creio que seja essa minha váriavel conne que estaja bixada, pois declarei ela tipo Connection e global… :cry:

brlima

provavelmente ela ta nulo. Vc nao inicializou ela.

paulinhohd

Connection conne só isso, como global.

paulinhohd

Desse modo funcionou:

try{ Conexao conn = new Conexao(); Statement FluxoSQL = conn.conexao.createStatement(); SimpleTableModel modelo = new SimpleTableModel(dados,colunas,edicao); JOptionPane.showMessageDialog(null,modelo.getValor(0)); String[] teste = modelo.getValor(0); int NumPedido = 0001; int NumItem = Integer.parseInt(teste[0]); int CodItem = Integer.parseInt(teste[1]); int ValItem = Integer.parseInt(teste[2]); JOptionPane.showMessageDialog(null,"INSERT INTO Tab_PedItem VALUES ("+NumPedido+","+NumItem+","+CodItem+","+ValItem+")"); String InstrucaoSQL = "INSERT INTO Tab_PedItem VALUES ("+NumPedido+","+NumItem+","+CodItem+","+ValItem+")"; FluxoSQL.executeUpdate(InstrucaoSQL); FluxoSQL.close(); } catch(Exception ex){ System.err.println("Inserção não efetuada!"); ex.printStackTrace(); }

Para os mais experientes o que acham?

Valeu! 8)

A

paulinhohd,

Voce criou uma tabela no access com o nome Tab_PedItem com tuplas com nomes NumPedido, NumItem, CodItem, ValItem ? Imagino que sim, pelo menos esta parecendo !

String InstrucaoSQL = "INSERT INTO Tab_PedItem VALUES ("+NumPedido+","+NumItem+","+CodItem+","+ValItem+")";

Valew, pq estou com uma duvida que talvez vc possa ter me ajudado

paulinhohd

marsola2k:
paulinhohd,

Voce criou uma tabela no access com o nome Tab_PedItem com tuplas com nomes NumPedido, NumItem, CodItem, ValItem ? Imagino que sim, pelo menos esta parecendo !

Valew, pq estou com uma duvida que talvez vc possa ter me ajudado

Isso mesmo…

Que bom que ajudou…

Valeu! 8)

A

uma duvida que surgiu nesse post, se quiser inserir no meu banco mais do que uma linha, no caso 3 ou 4 eu tenho que criar um vetor ou o que ? como ele fica no banco? pq eu tenho mais do que dois registros e por acaso ele usaria 2 linhas do banco, nao sei se estou certo.

Para eu fazer um select, é a mesma coisa ??

valew
[]s

paulinhohd

Para inserir no banco é só fazer um INSERT INTO na tabela que vc quer pegando todo mundo…creio que por if dá pra controlar isso…

Não entendi direito sua dúvida seria isso??

Valeu! 8)

A

nao muito, o que eu quis dizer foi ter tres linhas inseridas no JTable e como grava-la no banco e como recuperar esses dados do banco ?

paulinhohd

Ae, nem to conseguindo pegar todos os valores....alguém pode socorrer rs??

try{			
					int cont=0,campo0=0,campo1=1,campo2=2;
					do{
					Conexao conn = new Conexao();										
					Statement FluxoSQL = conn.conexao.createStatement();
					String[] teste = modelo.getValor(cont);
					int NumPedido = contlinhas;
					int NumItem = Integer.parseInt(teste[campo0]);
					int CodItem = Integer.parseInt(teste[campo1]);
					int ValItem = Integer.parseInt(teste[campo2]);
					//float ValItem = Integer.parseInt(teste[2]);
					//JOptionPane.showMessageDialog(null,"INSERT INTO Tab_PedItem VALUES ("+NumPedido+","+NumItem+","+CodItem+","+ValItem+")");
					String InstrucaoSQL = "INSERT INTO Tab_PedItem VALUES ("+NumPedido+","+NumItem+","+CodItem+","+ValItem+")";
					FluxoSQL.executeUpdate(InstrucaoSQL);
				 	FluxoSQL.close();
				 	cont++;
					}while(cont <= 5);
					
					}
				catch(Exception ex){
					System.err.println("Inserção não efetuada!");
					ex.printStackTrace();
			 		}

Tentei só fazer esse while para testar, mas ele dá erro, tentei fazer esse controle de váriaveis maluco aí que vcs estão vendo mas tb não funciona, alguém sabe um jeito mais prático e funcional??
:lol:
Valeu!! 8)

paulinhohd

Ae, nem to conseguindo pegar todos os valores....alguém pode socorrer rs??

try{			
					int cont=0,campo0=0,campo1=1,campo2=2;
					do{
					Conexao conn = new Conexao();										
					Statement FluxoSQL = conn.conexao.createStatement();
					String[] teste = modelo.getValor(cont);
					int NumPedido = contlinhas;
					int NumItem = Integer.parseInt(teste[campo0]);
					int CodItem = Integer.parseInt(teste[campo1]);
					int ValItem = Integer.parseInt(teste[campo2]);
					//float ValItem = Integer.parseInt(teste[2]);
					//JOptionPane.showMessageDialog(null,"INSERT INTO Tab_PedItem VALUES ("+NumPedido+","+NumItem+","+CodItem+","+ValItem+")");
					String InstrucaoSQL = "INSERT INTO Tab_PedItem VALUES ("+NumPedido+","+NumItem+","+CodItem+","+ValItem+")";
					FluxoSQL.executeUpdate(InstrucaoSQL);
				 	FluxoSQL.close();
				 	cont++;
					}while(cont <= 5);
					
					}
				catch(Exception ex){
					System.err.println("Inserção não efetuada!");
					ex.printStackTrace();
			 		}

Tentei só fazer esse while para testar, mas ele dá erro, tentei fazer esse controle de váriaveis maluco aí que vcs estão vendo mas tb não funciona, alguém sabe um jeito mais prático e funcional??
:lol:
Valeu!! 8)

A

vc esta querendo pegar o dado ou inserir, caso queria consultar faca o select, pq esta fazendo um insert :lol:

paulinhohd

Nem hahah vc não entendeu, estou querendo inserir mesmo…

Pegar todos os dados que o usuário digitou em minha TableModel, independente de foram uma ou 1000 linhas e pegar esses valores e inserir no banco entende…

Valeu! 8)

A

estou tendo o mesmo problema que vc, porem descobri que vc tem que fazer uma collection para poder armazer seus objetos dentro da collectio e pode inserir no banco ! mas como fazer isso estou pesquisando !

paulinhohd

Será que alquém pode nos ajudar pelo amor de Deus :?:

Valeu galera! 8)

Criado 4 de maio de 2005
Ultima resposta 20 de mai. de 2005
Respostas 30
Participantes 6