(Duvida) Cadastro +salvar em txt

Boa noite a todos,
Embora eu tenha feito um curso longo de Java e aprendido muito nele, eu fiquei 3 anos sem encostar um dedo em programação, logo após o término do curso. (estudando para vestibulares)
Ou seja, sou iniciante em Java novamente, apesar de estar com uma boa facilidade para aprender coisas, já que de certa forma é uma revisão.
Vamos ao problema:
Preciso fazer um programa que receba dados (nos respectivos Textfields), e quando o usuário apertar “Adicionar”, os dados sejam salvos em um arquivo (não necessariamente txt, acho que pra função que preciso, nem pode ser .txt)
Esses dados salvos são acessados pelo proprio programa, que pega somente o NOME da pessoa, no arquivo salvo, e coloca numa JList, e quando selecionada, abre um novo Frame com os dados todos da pessoa (também retirado do arquivo).
A questão é que a cada pessoa adicionada, é um novo nome pra JList, e isso não me vem a cabeça como fazer.
Não consegui, mesmo pesquisando, achar algum lugar que explique como fazer o programa pegar dados de um arquivo (ou outro método) e usar essas informações no programa, salvando-as em strings que serão transmitidas por JLabels.

Como estou a muito tempo sem programar, o código pode estar bagunçado, mas tentei comentar quando achei necessário… Existe algum ‘template’ pra organização de código? (Digo basicamente mesmo, como separar cada parte dele).

Vamos ao código.
Até agora, ele faz tudo… menos o que eu quero, salvar os dados em um arquivo a parte, e ler esse arquivo para coletar dados.

[code]import javax.swing.;
import javax.swing.event.
;
import javax.swing.JOptionPane;
import java.awt.;
import java.awt.event.
;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Formatter;
import java.io.File;

public class Cadastro extends JFrame {
//Declaração
// Objetos da GUI
private JButton lista, editar, adiciona, limpar;

// Declaracao Frame inicial
public JPanel pp, pnovo, p1, p2, p3, p4, p5;
private JLabel label1, nome, idade, sexo, tel, enf, nulo;
private JTextField nome2, idade2, tel2;
private JRadioButton masc, fem;
private ButtonGroup sexo2;
private JTextArea enferm;

// Declaracao Frame secundaria
private JFrame lFrame;
private JPanel fp2;
private JLabel pac;
private JList pacientes;
private JButton ver;
private String teste[]=
{
“Teste 1”, “Teste 2”, “Teste 3”, “Teste 4”, “Teste 5”, “Teste 6”, “Teste 7”
};

// Declaracao Frame Terciaria
private JFrame dFrame;
private JPanel fp3;

// Declaracao Geral
private Container cont;
private boolean toggle = true;
static Formatter fmt;
String data[][];
static String f = (“pacientes”);
// Layouts da GUI
private FlowLayout lp1, lp2, lp3;
public GridLayout gl1, gl2, gl3;
public BorderLayout bl1;

public Cadastro(){

//Criando e personalizando a GUI
super(“Controle de pacientes”);

	bl1 = new BorderLayout(2,1);
	gl2 = new GridLayout(5,1);
	gl3 = new GridLayout(2,1);
	Container cont = getContentPane();
	cont.setLayout(bl1);

	nulo = new JLabel("       ");
	pp = new JPanel();
	pnovo = new JPanel();
	p1 = new JPanel();
	p2 = new JPanel();
	p3 = new JPanel();
	p4 = new JPanel();
	p5 = new JPanel();

//Labels, Textfields, componentes da GUI
//Painel Principal
cont.add(pp, BorderLayout.NORTH);
pp.setLayout(new GridLayout(1,2));

	JButton lista = new JButton ("Lista de Pacientes");
	pp.add(lista);

	ButtonHandler handler = new ButtonHandler();
	lista.addActionListener(handler);
	pp.setVisible(true);

//Painel "Novo"
	pnovo.setLayout(gl2);
	cont.add(pnovo);
	pnovo.setVisible(true);
	pnovo.add(p1);
	pnovo.add(p2);
	pnovo.add(p3);
	pnovo.add(p4);

	nome = new JLabel("Nome: ");
	idade = new JLabel("  Idade: ");
	sexo = new JLabel("Sexo: ");
	enf = new JLabel("Enfermidade: ");
	nome2 = new JTextField(25);
	idade2 = new JTextField(10);
	masc = new JRadioButton("M",false);
	fem = new JRadioButton("F",true);
	sexo2 = new ButtonGroup();
	sexo2.add(masc);
	sexo2.add(fem);
	tel = new JLabel("Telefone: ");
	tel2 = new JTextField(10);

	enferm = new JTextArea(3,23);
	adiciona = new JButton("Adicionar");
	limpar = new JButton("Limpar");

	p1.setVisible(true);
	p2.setVisible(true);
	p3.setVisible(true);
	p4.setVisible(true);

	p1.setLayout(new BorderLayout());
	p2.setLayout(new GridLayout(1,5));
	p3.setLayout(new GridLayout(1,3));
	p4.setLayout(new BorderLayout());

	p1.add(nome, BorderLayout.WEST);
	p1.add(nome2, BorderLayout.EAST);
	p2.add(tel);
	p2.add(tel2);
	p2.add(nulo);
	p2.add(idade);
	p2.add(idade2);
	p2.add(nulo);
	p3.add(sexo);
	p3.add(masc);
	p3.add(fem);
	p4.add(enf, BorderLayout.WEST);
	p4.add(enferm, BorderLayout.EAST);
	p5.add(adiciona);
	p5.add(limpar);

//ButtonHandlers
ButtonHandler2 handler2 = new ButtonHandler2();
limpar.addActionListener(handler2);
ButtonHandler3 handler3 = new ButtonHandler3();
adiciona.addActionListener(handler3);
cont.add(p5, BorderLayout.SOUTH);

	setSize (355,200);
	setResizable(false);
	setVisible(true);

// Frame Listas /////////////////////////////////////////////////////////////
// GUI Frame2
lFrame = new JFrame(“Lista”);
fp2 = new JPanel();
fp2.setLayout(new BorderLayout(5,5));
lFrame.add(fp2);

	pac = new JLabel("Pacientes Cadastrados: ");
	pacientes = new JList(teste);
	pacientes.setVisibleRowCount(5);
	pacientes.setSelectionMode( ListSelectionModel.SINGLE_SELECTION);
	ver = new JButton ("Ver");
	fp2.add(pac, BorderLayout.NORTH);
	fp2.add(pacientes);
	fp2.add(new JScrollPane(pacientes));
	fp2.add(ver, BorderLayout.SOUTH);

	pacientes.addListSelectionListener(
		new ListSelectionListener(){
			public void valueChanged(ListSelectionEvent e){
				dFrame.setVisible(true);
			}
		}
	);
	lFrame.setResizable(false);
	fp2.setVisible(true);
	lFrame.setSize(300,200);
	lFrame.setLocation (355,0);

// Frame Dados /////////////////////////////////////////////////////////////
// GUI Frame3
dFrame = new JFrame(“Dados”);
fp3 = new JPanel();
fp3.setLayout(new BorderLayout(5,5));
dFrame.add(fp3);

	dFrame.setResizable(false);
	dFrame.setSize(655,200);
	dFrame.setLocation(0,200);
}

void FormatOutput(String name, String phone, String age, String sex, String illness) throws IOException
{
    fmt.format("%1$-30s %2$-13s %3$-11s %4$-7s %5$-4s%n", name, phone, age, sex, illness);
}

public static void main(String[] args) throws IOException
{
if(!(new File(f+".txt").exists())){

        String[][] data = {
            {"", "", "", "", ""},
	};
        Cadastro formatt = new Cadastro();
        FileWriter out = new FileWriter("pacientes.txt", true);
        BufferedWriter buf = new BufferedWriter(out);
        fmt = new Formatter(buf);
        fmt.format("%1$2s%n", "Nome  			       Telefone      Idade	Sexo	Enfermidade");
        for(int n=0; n<data.length; n++){
		formatt.FormatOutput(data[n][0], data[n][1], data[n][2], data[n][3], data[n][4]);
	}
		fmt.close();
}
else{
	Cadastro app = new Cadastro();
	app.addWindowListener(
		new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		}
	);
}

}
private class ButtonHandler implements ActionListener{
	public void actionPerformed(ActionEvent e){
	lFrame.setVisible(true);
	}
}

private class ButtonHandler2 implements ActionListener{
	public void actionPerformed(ActionEvent e){
		nome2.setText("");
		tel2.setText("");
		idade2.setText("");
		enferm.setText("");

	}
}

private class ButtonHandler3 implements ActionListener{
	public void actionPerformed(ActionEvent e){

	}
}

}[/code]

Muito obrigado a todos.

Nao sou muito fã de trabalhar com arquivos nesses casos, bem melhor usar um banco de dados. Mas no seu caso acho que a solução mais elegante e correta seria criar uma classe Paciente que tivesse todos estes atributos (idade, nome, telefone, etc) aí vc setaria os dados e salvaria o seu objeto paciente diretamente no arquivo. Assim vc leria o objeto inteiro do arquivo e ele ja traria todos os dados atrelados a ele, ou seja, vc nao precisaria salvar todas as strings como vc ta fazendo. Para isso sua classe Paciente deve implementar a interface Serializable (uma interface de marcacao). E quando vc fosse escrever no arquivo vc usaria o metodo writeObject(paciente) da classe ObjectOutputStream, e leria usando o readObject() da ObjectInputStream para pegar o objeto paciente apropriado.

Uma dica, pq nao trabalha ao inves de txt com xml usando XStream??

Hmm
Muito obrigado pelas dicas =]
Sobre o xml, eu nunca tentei e acho que demoraria um pouco mais que o normal pra aprender, e preciso terminar esse trabalho pra universidade, rapido.

Desculpe esse pedido, mas alguem poderia me dar um exemplo simples de como fazer isso?
Por mais que eu tente, não está saindo, e isso é frustrante >.<
Procurei exemplos, tentei muitas coisas, e não funciona!
Obrigado

Ok, alterei seu código te mostrando como voce deve fazer. Para testar basta ter as duas classes no mesmo pacote. Usei o que eu tinha te explicado em cima.

Primeiro a classe Paciente

import java.io.Serializable;

/**
 *
 * @author Roberto
 */
public class Paciente implements Serializable{

    private String nome;
    private String telefone;
    private int idade;
    private String plano;

    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;
    }

    public int getIdade() {
        return idade;
    }

    public void setIdade(int idade) {
        this.idade = idade;
    }

    public String getPlano() {
        return plano;
    }

    public void setPlano(String plano) {
        this.plano = plano;
    }
}

Agora a sua classe com tudo funcionando inclusive a funcao de adicionar. Inseri apenas os dois metodos e mudei um pouco seu metodo main.


import javax.swing.*;
import javax.swing.event.*;
import javax.swing.JOptionPane;
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Formatter;
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.io.EOFException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class Cadastro extends JFrame {
//Declaração
   // Objetos da GUI
	private JButton lista, editar, adiciona, limpar;

   // Declaracao Frame inicial
	public JPanel pp, pnovo, p1, p2, p3, p4, p5;
	private JLabel label1, nome, idade, sexo, tel, enf, nulo;
	private JTextField nome2, idade2, tel2;
	private JRadioButton masc, fem;
	private ButtonGroup sexo2;
	private JTextArea enferm;

   // Declaracao Frame secundaria
	private JFrame lFrame;
	private	JPanel fp2;
	private JLabel pac;
	private JList pacientes;
	private JButton ver;
	private String teste[]=
		{
			"Teste 1", "Teste 2", "Teste 3", "Teste 4", "Teste 5", "Teste 6", "Teste 7"
		};

   // Declaracao Frame Terciaria
	private JFrame dFrame;
	private JPanel fp3;

   // Declaracao Geral
	private Container cont;
	private boolean toggle = true;
	static Formatter fmt;
        String data[][];
	static String f = ("pacientes");
   // Layouts da GUI
	private FlowLayout lp1, lp2, lp3;
	public GridLayout gl1, gl2, gl3;
	public BorderLayout bl1;

	public Cadastro(){

//Criando e personalizando a GUI
		super("Controle de pacientes");

		bl1 = new BorderLayout(2,1);
		gl2 = new GridLayout(5,1);
		gl3 = new GridLayout(2,1);
		Container cont = getContentPane();
		cont.setLayout(bl1);

		nulo = new JLabel("       ");
		pp = new JPanel();
		pnovo = new JPanel();
		p1 = new JPanel();
		p2 = new JPanel();
		p3 = new JPanel();
		p4 = new JPanel();
		p5 = new JPanel();

//Labels, Textfields, componentes da GUI
	//Painel Principal
		cont.add(pp, BorderLayout.NORTH);
		pp.setLayout(new GridLayout(1,2));

		lista = new JButton ("Lista de Pacientes");
		pp.add(lista);

		ButtonHandler handler = new ButtonHandler();
		lista.addActionListener(handler);
		pp.setVisible(true);

	//Painel "Novo"
		pnovo.setLayout(gl2);
		cont.add(pnovo);
		pnovo.setVisible(true);
		pnovo.add(p1);
		pnovo.add(p2);
		pnovo.add(p3);
		pnovo.add(p4);

		nome = new JLabel("Nome: ");
		idade = new JLabel("  Idade: ");
		sexo = new JLabel("Sexo: ");
		enf = new JLabel("Enfermidade: ");
		nome2 = new JTextField(25);
		idade2 = new JTextField(10);
		masc = new JRadioButton("M",false);
		fem = new JRadioButton("F",true);
		sexo2 = new ButtonGroup();
		sexo2.add(masc);
		sexo2.add(fem);
		tel = new JLabel("Telefone: ");
		tel2 = new JTextField(10);

		enferm = new JTextArea(3,23);
		adiciona = new JButton("Adicionar");
		limpar = new JButton("Limpar");

		p1.setVisible(true);
		p2.setVisible(true);
		p3.setVisible(true);
		p4.setVisible(true);

		p1.setLayout(new BorderLayout());
		p2.setLayout(new GridLayout(1,5));
		p3.setLayout(new GridLayout(1,3));
		p4.setLayout(new BorderLayout());

		p1.add(nome, BorderLayout.WEST);
		p1.add(nome2, BorderLayout.EAST);
		p2.add(tel);
		p2.add(tel2);
		p2.add(nulo);
		p2.add(idade);
		p2.add(idade2);
		p2.add(nulo);
		p3.add(sexo);
		p3.add(masc);
		p3.add(fem);
		p4.add(enf, BorderLayout.WEST);
		p4.add(enferm, BorderLayout.EAST);
		p5.add(adiciona);
		p5.add(limpar);

//ButtonHandlers
		ButtonHandler2 handler2 = new ButtonHandler2();
		limpar.addActionListener(handler2);
		ButtonHandler3 handler3 = new ButtonHandler3();
		adiciona.addActionListener(handler3);
		cont.add(p5, BorderLayout.SOUTH);

		setSize (355,200);
		setResizable(false);
		setVisible(true);

// Frame Listas /////////////////////////////////////////////////////////////
// GUI Frame2
		lFrame = new JFrame("Lista");
		fp2 = new JPanel();
		fp2.setLayout(new BorderLayout(5,5));
		lFrame.add(fp2);

		pac = new JLabel("Pacientes Cadastrados: ");
//adicionado aqui para carregar o arquivo
     ArrayList<Paciente> totalPacientes=lePacientes();
     String novoTeste[]= new String[totalPacientes.size()];
     for(int i=0; i<totalPacientes.size(); i++){
         novoTeste[i]=totalPacientes.get(i).getNome();
     }
     teste=novoTeste;
//fim                
                
                pacientes = new JList(teste);
		pacientes.setVisibleRowCount(5);
		pacientes.setSelectionMode( ListSelectionModel.SINGLE_SELECTION);
		ver = new JButton ("Ver");
		fp2.add(pac, BorderLayout.NORTH);
		fp2.add(pacientes);
		fp2.add(new JScrollPane(pacientes));
		fp2.add(ver, BorderLayout.SOUTH);

		pacientes.addListSelectionListener(
			new ListSelectionListener(){
				public void valueChanged(ListSelectionEvent e){
					dFrame.setVisible(true);
				}
			}
		);
		lFrame.setResizable(false);
		fp2.setVisible(true);
		lFrame.setSize(300,200);
		lFrame.setLocation (355,0);

// Frame Dados /////////////////////////////////////////////////////////////
// GUI Frame3
		dFrame = new JFrame("Dados");
		fp3 = new JPanel();
		fp3.setLayout(new BorderLayout(5,5));
		dFrame.add(fp3);

		dFrame.setResizable(false);
		dFrame.setSize(655,200);
		dFrame.setLocation(0,200);
	}
//adicionado por roberto
    public static java.util.ArrayList<Paciente> lePacientes(){
        ArrayList<Paciente> retorno= new ArrayList<Paciente>();
        java.io.FileInputStream fis=null;
        java.io.ObjectInputStream ois=null;
        try{
            fis= new FileInputStream(new File("pacientes.txt"));
             ois= new ObjectInputStream(fis);
            Paciente pa=new Paciente();
            while(pa!=null){
            pa=(Paciente)ois.readObject();
            
                retorno.add(pa);
            }
            ois.close();
            fis.close();
        }catch(EOFException ex){
            try{
            ex.printStackTrace();
            ois.close();
            fis.close();
            }catch(Exception ex2){
                ex2.printStackTrace();
            }
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
        return retorno;
    }
    
    
    public static void inserePaciente(Paciente pac){
        ArrayList<Paciente> lista= lePacientes();
        boolean existe=false;
        for(Paciente aux: lista){
            if(aux.getNome().equals(pac.getNome())){ 
                existe=true; break;
            }
        }
        if(!existe){
            try{
            FileOutputStream output= new FileOutputStream(new File("pacientes.txt"));
            ObjectOutputStream ous= new ObjectOutputStream(output);
            for(Paciente aux: lista){     
            ous.writeObject(aux);
            }
            ous.writeObject(pac);
            ous.flush();
            ous.close();
            output.close();
        }catch(Exception ex3){
            ex3.printStackTrace();
        }
        }
        
    }
 //aqui acaba o codigo que foi adicionado   
    void FormatOutput(String name, String phone, String age, String sex, String illness) throws IOException
    {
        fmt.format("%1$-30s %2$-13s %3$-11s %4$-7s %5$-4s%n", name, phone, age, sex, illness);
    }

    public static void main(String[] args) throws IOException
    {

                File file= new File("pacientes.txt");
                if(!file.exists()){
                        file.createNewFile();
                        Paciente p1= new Paciente();
                        Paciente p2= new Paciente();
                        Paciente p3= new Paciente();
                        p1.setNome("Beto"); p1.setIdade(13); p1.setTelefone("123456");
                        p2.setNome("Maria"); p2.setIdade(20); p2.setPlano("amil");
                        p3.setNome("Joao"); p3.setIdade(33); p3.setTelefone("098765");

                    inserePaciente(p1); inserePaciente(p2); inserePaciente(p3);
                }
                Cadastro app= new Cadastro();
                app.addWindowListener(
			new WindowAdapter(){
				public void windowClosing(WindowEvent e){
					System.exit(0);
				}
			}
		);

    }
	private class ButtonHandler implements ActionListener{
		public void actionPerformed(ActionEvent e){
		
                //adicionado aqui para carregar o arquivo
                 ArrayList<Paciente> totalPacientes=lePacientes();
                 String novoTeste[]= new String[totalPacientes.size()];
                 for(int i=0; i<totalPacientes.size(); i++){
                     novoTeste[i]=totalPacientes.get(i).getNome();
                 }
                 teste=novoTeste;
                pacientes.setListData(teste);
                 //fim 
                    
                lFrame.setVisible(true);
		}
	}

	private class ButtonHandler2 implements ActionListener{
		public void actionPerformed(ActionEvent e){
			nome2.setText("");
			tel2.setText("");
			idade2.setText("");
			enferm.setText("");

		}
	}

	private class ButtonHandler3 implements ActionListener{
		public void actionPerformed(ActionEvent e){
                        
                    //adicionado aqui
                    Paciente pac= new Paciente();
                    pac.setNome(nome2.getText());
                    pac.setTelefone(tel2.getText());
                    pac.setIdade(Integer.parseInt(idade2.getText()));
                    inserePaciente(pac);
                    //fim
		}
	}

}

Pra fazer rapido acabo sempre reescrenvendo os objetos no arquivo depois de lê-los, mas vc pode escrever apenas seu objeto mudando a linha
new FileOutputStream(new File(“pacientes.txt”)) para new FileOutputStream(new File(“pacientes.txt”), true) aí ele acrescenta no final.

Espero ter ajudado…

betoslayer, MUITO obrigado, mesmo mesmo!
Agora entendi como faz =] o código ficou facil de entender, se comparado aos outros que eu li. Acho que agora consigo fazer um semelhante por conta própria.

Problema resolvido já, obrigado!