Text file is not displayed completely in Jtextarea

Asked

Viewed 261 times

2

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

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

he just shows me Nome: Maria Idade 32 and Nome Joao, the rest he ignores.

Class Filing cabinet

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 Modeller

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 Viewnomeity

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 Viewexibir

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 Controlenomeidade

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());
    }
}
  • This code is not executable. Please add a [mcve] so that it is possible to test the code to simulate the problem.

  • But it is executable: only missing``public Static void main(String[] args) { new Controlsoftness(new Viewnomeity(), new Viewexibir()); }

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 ;, where the line break also separates the saved data. The most common way to read lines is to store them in a list(or array) and then scan with a loop.

Another problem in your class Arquivo in this passage:

try {

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

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

As a suggestion to solve the question problem and this other problem by changing as little of your code as possible, I suggest you return a ArrayList containing the lines, this makes it much easier to list inside the textarea. Modify the reading method to 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 his actionPerformed() 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 of each row.

This fix will expose another problem in your code, which is the lack of a scroll bar on JTextArea, because you’re using absolute layout (which I don’t recommend unless you know what you’re doing) and you’re not adding this component to a JScrollPane. To make it right, change your screen ViewExibir for:

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

Working:

inserir a descrição da imagem aqui

With these changes, the file display problem in the text field is solved, but it is worth noting that there are other problems in the code (as you do not dispatch the graphical interface to the EDT), but that I will not stick to them because they are not related to the problem of the question.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.