Gravar dados de um JTable em xml

13 respostas
N

Pessoal, sou nova aqui, mas estou com uma tremenda duvida, ja tentei de tudo, ja pesquisei bastante e nao achei nenhuma solução.
Bem o meu problema é o seguinte, digito dados em um JTextField e o sistema acrescenta em um JTable até ai tudo bem,só que eu quero pegar os dados mostrado no JTable e salvar em um arquivo xml, so q nao sei como eu faço.
O código que estou utilizando é esse abaixo:

package br.teste.exemplos;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import com.thoughtworks.xstream.XStream;

public class TesteComTable extends JFrame{
	JTextField t1, t2;
	JLabel l1, l2;
	JTable tabela;
	JButton b1, b2, b3, b4;
    DefaultTableModel dtm;
    Agenda a = new Agenda();
	
	public TesteComTable (){
		InterfaceTeste();
	}
	
	public void InterfaceTeste(){
		setTitle("Teste tabela");
		setSize(600, 285);
		getContentPane().setBackground(new Color(150, 205, 205));
		
		Color c = new Color (150, 205, 205);
		
		l1 = new JLabel ("Nome:");
		l2 = new JLabel ("Telefone:");
		
		t1 = new JTextField ();
		t2 = new JTextField ();
		
		b1 = new JButton ("Adicionar");
		b1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){Adicione();}	
		});
		
		b2 = new JButton ("Excluir");
		b2.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){Excluir();}
		});
		
		b3 = new JButton ("Salvar");
		b3.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){Gravar();}
		});
		
		b4 = new JButton ("Limpar");
		
		tabela = new JTable(0, 2);
		 dtm = (DefaultTableModel)tabela.getModel();
		Object coluna[]={"Nome", "Telefone"};
		dtm.setColumnIdentifiers(coluna);
		
		JPanel Direito = new JPanel(new GridLayout(0,1));
		Direito.setBackground(c);
		Direito.add(l1);
		Direito.add(t1);
		Direito.add(l2);
		Direito.add(t2);
		
		JPanel Esquerdo = new JPanel (new GridLayout(0,1));
		Esquerdo.setBackground(c);
		Esquerdo.add(b1);
		Esquerdo.add(b2);
		Esquerdo.add(b3);
		Esquerdo.add(b4);
		
		JScrollPane Centro = new JScrollPane(tabela);
		Centro.setBackground(c);
		
		Container con = getContentPane();
		BorderLayout layout = new BorderLayout();
		con.setLayout(layout);
		con.add(BorderLayout.WEST, Direito);
		con.add(BorderLayout.EAST, Esquerdo);
		con.add(BorderLayout.CENTER, Centro);
	
	}
	
	public void Adicione() {
		a.setNome(t1.getText());
		a.setTelefone(t2.getText());
		dtm = (DefaultTableModel)tabela.getModel();
		dtm.addRow(new Object[]{a.getNome(), a.getTelefone()});
		
		t1.setText("");
		t2.setText("");
		t1.grabFocus();
		
	}
	
	public void Excluir(){
		try{
			int linha = tabela.getSelectedRow();
			//remover da janela
			dtm.removeRow(linha);
		}
		catch (Exception e){
			JOptionPane.showMessageDialog(null, "Impossível excluir!\nLinha não selecionada");
		}
	}
	
	public void Gravar(){
		String entrada= JOptionPane.showInputDialog("Informe o nome a qual deseja salvar o arquivo:");
		
		String arquivo = Diretorio()+"\\"+entrada+".xml";
		
		
		//for (int i=0; i<tabela.getRowCount(); i++){
		//SalvaArquivoXML (dtm);
		//}
		//boolean adiciona = true;

	}
	
	public String Diretorio (){
		JFileChooser fc = new JFileChooser();
        
        // restringe a amostra a diretorios apenas
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        
        int res = fc.showOpenDialog(null);
        
        if(res == JFileChooser.APPROVE_OPTION){
            File diretorio = fc.getSelectedFile();
            String dir = diretorio.getPath();
            return dir;
        }
        else
            JOptionPane.showMessageDialog(null, "Voce nao selecionou nenhum diretorio.");
		return null; 
    }
	
	/*public void SalvaArquivoXML (DefaultTableModel dtm){
		//XStream arquivoXML = new XStream();
		for (int j=0; j<=dtm.getRowCount(); j++)
		for(int i=0; i<=dtm.getColumnCount(); i++)
		{
			
			JOptionPane.showMessageDialog(null, (String)dtm.getValueAt(j,i));
		}
		
		
		
	}*/
	
	public static void main (String [] args){
		JFrame janela = new TesteComTable();
		janela.setLocationRelativeTo(null);
		janela.setVisible(true);
	}

}

Agradeço

13 Respostas

ViniGodoy

Oi, bem-vinda ao fórum.

Algumas dicas:

  1. Não use DefaultTableModel. Siga as dicas na minha assinatura para aprender a usar o JTable;
  2. Conforme diz a documentação do próprio método, não use o método grabFocus(), no lugar use o requestFocusInWindow();
  3. Você salva os dados de modelo em XML, não a tabela.
dg_cursos_de_java

olá…

uma dica para seu código ficar mais limpo… isso é muito avaliado pelas empresas…

resumindo essas linhas:

<blockquote>import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Container;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.File;
import javax.swing.JButton;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JTextField;

import javax.swing.table.DefaultTableModel;

import com.thoughtworks.xstream.XStream;

substitua essas linhas por apenas estas…

import java.awt.*; import java.io.File; import javax.swing.*; import com.thoughtworks.xstream.XStream;

seu código ficara mais limpo!

Grande abraço… precisando de algo… pode mandar e-mail… estou a disposição! :wink:

N

O código ta meio bagunçado, pois estava tentando ver como eu pegava os dados da tabela, mas não estava conseguindo pois pegava de uma linha e dava erro quando ia pra segunda. Eu queria saber como pegar esses dados para depois salvar xml.
E outra se eu nao usar DefaultTableModel qual utilizo?

ViniGodoy

naniroll.03:
O código ta meio bagunçado, pois estava tentando ver como eu pegava os dados da tabela, mas não estava conseguindo pois pegava de uma linha e dava erro quando ia pra segunda. Eu queria saber como pegar esses dados para depois salvar xml.
E outra se eu nao usar DefaultTableModel qual utilizo?

Você cria seu próprio TableModel, filho de AbstractTableModel. Ele irá trabalhar diretamente com suas classes de negócio.
Veja o link da minha assinatura para entender melhor.

N

obrigada vou tentar, qualquer dúvida volto aqui novamente.

N

Fiz as mudanças para AbstractTableModel, mas agora está dando outro problema. Ja procurei por tudo que é site e no forum, mas nao achei algo q me ajudassem.
Quando adiciono um nova linha no JTable, o conteudo da linha ja criada fica com o conteudo dessa nova linha e assim sucessivamente. Se eu criar n linhas as n linhas terao o mesmo conteudo.
Agradeço

ViniGodoy

Posta seu model.

N
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class AgendaTableModel extends AbstractTableModel {
	private static final int COL_NOME = 0;
	private static final int COL_TELEFONE = 1;
	
	private List<Agenda> valores;
	
	public AgendaTableModel() {
		this.valores = new ArrayList<Agenda>();
	}
	
	public AgendaTableModel (List <Agenda> valores){
		this.valores = new ArrayList <Agenda>(valores);
	}
	
	@Override
	public int getRowCount() {
		return valores.size();
	}

	@Override
	public int getColumnCount() {
		return 2;
	}

	public String getColumnName (int column){
		if (column == COL_NOME)return "Nome";
		if (column == COL_TELEFONE)return "Telefone";
		return "";
	}

	@Override
	public Object getValueAt(int row, int column) {
		Agenda dados = valores.get(row);
		if (column == COL_NOME)return dados.getNome();
		else if (column == COL_TELEFONE)return dados.getTelefone();
		return "";
	}
	
	public void setValueAt (Object avalue, int rowIndex, int columnIndex){
		Agenda dados = valores.get(rowIndex);
		if (columnIndex == COL_NOME) dados.setNome(avalue.toString());
		else if (columnIndex == COL_TELEFONE)dados.setTelefone(avalue.toString());
		
	}
	
	public Class <?> getColumnClass (int columnIndex){
		return String.class;
	}
	
	public boolean isCellEditable (int rowIndex, int columnIndex){
		return false;
	}
	
	public Agenda get (int row){
		return valores.get(row);
	}
	
	public void adiciona(Agenda a) {
		valores.add(a);
		fireTableRowsInserted(valores.size()-1 ,valores.size()-1);
	}
	
	public void remove(int indice) {
		valores.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}
}
ViniGodoy

Posta sua classe Agenda. Por acaso nela tudo é static? Se for, o erro é esse.

N

Vini, os dados da classe Agenda não estão estático, dá uma olhada.

public class Agenda { private String nome; private String telefone; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; }
Será que o problema é na hora de adicionar? Aqui está o metódo que adiciona na tabela:

public void Adicione() { a.setNome(t1.getText()); a.setTelefone(t2.getText()); agenda.adiciona(a); t1.setText(""); t2.setText(""); t1.requestFocusInWindow(); }

ViniGodoy

Sim, tem que fazer um “new Agenda” aí. Senão vc só altera os valores do mesmo objeto.

ViniGodoy

public void Adicione() { Agenda a = new Agenda(); a.setNome(t1.getText()); a.setTelefone(t2.getText()); agenda.adiciona(a); t1.setText(""); t2.setText(""); t1.requestFocusInWindow(); }

N

Valeu Vini, deu certo.
Obrigada!!!

Criado 10 de setembro de 2010
Ultima resposta 13 de set. de 2010
Respostas 13
Participantes 3