The text file does not appear completely in JTextArea

2

I put it to show the packages, so you can tell me if I'm making the correct use of MVC If I save in txt:

 [Maria;32] ; [Joao;44] e [Luna,12]' 

It only shows me Nome: Maria Idade 32 and Nome Joao , the rest it ignores.

  

Class Archive

package model;

public class Arquivo {

public static String Read(String Caminho){
     String conteudo = "";
        try {
            FileReader arq = new FileReader(Caminho);
            BufferedReader lerArq = new BufferedReader(arq);
            String linha="";
            try {
                linha = lerArq.readLine();
                while(linha!=null){
                    linha = lerArq.readLine();
                    conteudo += linha+"\r\n";
                }
                arq.close();
                return conteudo;
            } catch (IOException ex) {
                System.out.println("Erro: Não foi possível ler o arquivo!");
                return "";
            }
        } catch (FileNotFoundException ex) {
            System.out.println("Erro: Arquivo não encontrado!");
            return "";
        }}

public static boolean Write(String Caminho,String Texto){
    try {
        FileWriter arq = new FileWriter(Caminho,true);
        PrintWriter gravarArq = new PrintWriter(arq);
        gravarArq.println(Texto);
        gravarArq.close();
        return true;
    }catch(IOException e){
        System.out.println(e.getMessage());
        return false;
    }
}}
  

Class ModelAluno

package model;

public class ModelAluno {

    String nome;
    String idade;

    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getIdade() {
        return idade;
    }
    public void setIdade(String idade) {
        this.idade = idade;
    }

    public boolean persisitir(){
        return true;
    }
}
  

Class ViewHomeName

package visao;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTextPane;

public class ViewNomeIdade extends JFrame {

    public JPanel contentPane;
    public JTextField txtNome;
    public JTextField txtIdade;
    public JButton btSalvar;
    private JButton btnExibir;

    public ViewNomeIdade() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 446, 139);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel lblNome = new JLabel("Nome");
        lblNome.setBounds(10, 11, 46, 14);
        contentPane.add(lblNome);

        JLabel lblIdade = new JLabel("Idade");
        lblIdade.setBounds(10, 50, 46, 14);
        contentPane.add(lblIdade);

        txtNome = new JTextField();
        txtNome.setBounds(60, 8, 86, 20);
        contentPane.add(txtNome);
        txtNome.setColumns(10);

        txtIdade = new JTextField();
        txtIdade.setBounds(60, 47, 86, 20);
        contentPane.add(txtIdade);
        txtIdade.setColumns(10);

        btSalvar = new JButton("Salvar");
        btSalvar.setBounds(57, 77, 89, 23);
        contentPane.add(btSalvar);

        btnExibir = new JButton("Exibir");
        btnExibir.setBounds(172, 77, 89, 23);
        contentPane.add(btnExibir);
    }

    public JTextField getTxtNome() {
        return txtNome;
    }

    public void setTxtNome(JTextField txtNome) {
        this.txtNome = txtNome;
    }

    public JTextField getTxtIdade() {
        return txtIdade;
    }

    public void setTxtIdade(JTextField txtIdade) {
        this.txtIdade = txtIdade;
    }

    public JButton getBtSalvar() {
        return btSalvar;
    }

    public void setBtSalvar(JButton btSalvar) {
        this.btSalvar = btSalvar;
    }

    public JButton getBtnExibir() {
        return btnExibir;
    }
}
  

Class ViewView

package visao;

import java.awt.Dimension;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

public class ViewExibir extends JFrame {

    private JPanel contentPane;
    JTextArea textArea;

    public ViewExibir() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 301, 203);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        textArea = new JTextArea();
        textArea.setBounds(62, 11, 146, 127);
        contentPane.add(textArea);
    }

    public JTextArea getTextArea() {
        return textArea;
    }

    public void setTextArea(JTextArea textArea) {
        this.textArea = textArea;
    }
}
  

Class ControlHomeName

package controle;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import model.Arquivo;
import model.ModelAluno;
import visao.ViewExibir;
import visao.ViewNomeIdade;

public class ControleNomeIdade implements ActionListener{

    ViewNomeIdade v ;
    ViewExibir vi ;
    ModelAluno m = new ModelAluno();
    String ArqConfig = "salvar.txt";

    public ControleNomeIdade(ViewNomeIdade v, ViewExibir vi) {
        this.v = v;
        this.vi = vi;
        v.getBtSalvar().addActionListener(this);
        v.getBtnExibir().addActionListener(this);
        v.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == v.getBtSalvar()){
            m.setNome(v.getTxtNome().getText());
            m.setIdade(v.getTxtIdade().getText());
            String print = m.getNome()+";"+m.getIdade();

            if(Arquivo.Write(ArqConfig,print))
                System.out.println("Arquivo salvo com sucesso!");
            else
                System.out.println("Erro ao salvar o arquivo!");
        }

        else if(e.getSource() == v.getBtnExibir()){
            String conteudo = Arquivo.Read(ArqConfig);
            String c1 = conteudo.split(";")[0];
            String c2 = conteudo.split(";")[1];
            System.out.println("Nome: " + c1 + "\nIdade: " + c2);
            vi.getTextArea().append("Nome: " + c1 + "\nIdade: " + c2);
            vi.setVisible(true);
        }

    }
}
  

Main class

package controle;

import visao.ViewExibir;
import visao.ViewNomeIdade;

public class Principal {

    public static void main(String[] args) {
        new ControleNomeIdade(new ViewNomeIdade(), new ViewExibir());
    }
}
    
asked by anonymous 18.12.2017 / 05:42

1 answer

2

The problem is that you are rescuing the entire contents of the file as a single string and applying split() only when you find ; , and the line break also separates the saved data. The most common way to read rows is to store them in a list (or array) and then sweep with a loop.

Another problem in your class Arquivo in this section:

try {

    while(linha!=null){
        linha = lerArq.readLine();
        conteudo += linha+"\r\n";
    }

Note that you read the line, enter the loop, read the line again before concatenating, this will make a line jump.

As a suggestion to solve the problem of the question and this other problem by changing the minimum possible of your code, I suggest that you return a ArrayList containing the lines, this makes it much easier to list later within the textarea. Modify the read method for the following:

public static List<String> Read(String Caminho) {
    List<String> conteudo = new ArrayList<>();

    try {
        FileReader arq = new FileReader(Caminho);
        BufferedReader lerArq = new BufferedReader(arq);
        String linha = "";
        try {
            linha = lerArq.readLine();
            while (linha != null) {
                conteudo.add(linha);
                linha = lerArq.readLine();
            }
            arq.close();
            return conteudo;
        } catch (IOException ex) {
            System.out.println("Erro: Não foi possível ler o arquivo!");
        }
    } catch (FileNotFoundException ex) {
        System.out.println("Erro: Arquivo não encontrado!");
    }
    return null;
}

In your actionPerformed() of class ControleNomeIdade where you read the file, change as below:

@Override
public void actionPerformed(ActionEvent e) {

    if (e.getSource() == v.getBtSalvar()) {
        m.setNome(v.getTxtNome().getText());
        m.setIdade(v.getTxtIdade().getText());
        String print = m.getNome() + ";" + m.getIdade();

        if (Arquivo.Write(ArqConfig, print))
            System.out.println("Arquivo salvo com sucesso!");
        else
            System.out.println("Erro ao salvar o arquivo!");
    }

    else if (e.getSource() == v.getBtnExibir()) {
        List<String> conteudo = Arquivo.Read(ArqConfig);

        for(String linha : conteudo) {
            String c1 = linha.split(";")[0];
            String c2 = linha.split(";")[1];
            System.out.println("Nome: " + c1 + "\nIdade: " + c2);
            vi.getTextArea().append("Nome: " + c1 + "\nIdade: " + c2);
            vi.getTextArea().append("\n\n");
        }
        vi.setVisible(true);
    }
}

Note that at each index of the read list, I add two line breaks, in order to group the data for each row.

This fix will expose another problem in your code, which is the lack of a scrollbar in JTextArea , since you're using absolute layout (which I do not recommend unless you know what you're doing) and you are not adding this component to JScrollPane . To make it correct, change your screen ViewExibir to:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

public class ViewExibir extends JFrame {

    private JPanel contentPane;
    JTextArea textArea;

    public ViewExibir() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 301, 203);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        textArea = new JTextArea();
        JScrollPane scroll = new JScrollPane(textArea);
        scroll.setBounds(62, 11, 146, 127);
        contentPane.add(scroll);
    }

    public JTextArea getTextArea() {
        return textArea;
    }

    public void setTextArea(JTextArea textArea) {
        this.textArea = textArea;
    }
}

Running:

Withthesechanges,theproblemofdisplayingthefileinthetextfieldisresolved,butit'sworthnotingthatthereareotherproblemsinthecode(suchasyoudonot dispatching the graphical interface for EDT ), but I will not stick to them because they are not related to the question problem.

    
18.12.2017 / 14:57