Text aus Datei in eine JTextArea einlesen?

flashray

Erfahrenes Mitglied
Hallo,

das Einlesen von Text aus einer Datei in eine JTextArea bekomme ich leider nicht 100% hin. Also das Einlesen ist ja im Grunde ziemlich einfach und funktioniert tadellos. Nur wenn der Text am Anfang oder Ende eine oder mehrere Leerzeilen hat fehlt manchmal eine Leerzeile oder es ist eine zuviel, je nach dem wie ich die Schleife zum Einlesen implementiert habe. Habs leider noch nicht hinbekommen das das Einlesen für alle Testfälle korrekt arbeitet. Hier bspw. in der unteren Implementierung fehlt für den Fall zwei eine Leerzeile nach dem Einlesen.

Testfälle:
Textdatei mit einer Leerzeile
Textdatei mit zwei Leerzeilen
Textdatei mit drei Leerzeilen

Testprogramm:
Code:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class TextRead extends JFrame implements ActionListener {

	JTextArea t = new JTextArea();

	JScrollPane s = new JScrollPane(t);

	JButton b = new JButton("read");

	JTextField tf = new JTextField("C:\\...");

	public TextRead() {
		b.addActionListener(this);

		setLayout(new BorderLayout());
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setAlwaysOnTop(true);
		add(b, BorderLayout.NORTH);
		add(s, BorderLayout.CENTER);
		add(tf, BorderLayout.SOUTH);
		setVisible(true);
	}

	public static void main(String[] args) {
		TextRead tr = new TextRead();
	}

	public void actionPerformed(ActionEvent e) {

		String text = "";
		String path = tf.getText();

		try {
			BufferedReader input = new BufferedReader(new FileReader(path));
			String line;

			if ((line = input.readLine()) != null)
				text = line;

			while ((line = input.readLine()) != null) {
				text = text + '\n' + line;
			}
			if (text.endsWith("\n"))
				text = text + "\n";

			input.close();
			
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		
		t.setText(text);
		setTitle("Line: " + t.getLineCount() + " Pfad: "
				+ path.substring(path.length() - 10, path.length()));
	}
}

Vg Erdal
 
Code:
StringBuffer sb = new StringBuffer();
while(input.ready()) {
sb.append(input.readLine());
if (in.ready()) {
sb.append('\n');
}
}
t.setText(sb.toString());

Damit müßtest Du eigentlich im Textfeld genau das stehen haben, was in Deiner Datei steht.
 
Hallo!

Warum immer so kompliziert?
Code:
/**
 * 
 */
package de.tutorials;

import java.awt.Dimension;
import java.io.FileReader;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * @author Tom
 * 
 */
public class JTextAreaExample extends JFrame {

    public JTextAreaExample() {
        super("JTextAreaExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JTextArea textArea = new JTextArea();
        try {
            textArea.read(new FileReader("c:/gc1.txt"), "");
        } catch (Exception e) {
            e.printStackTrace();
        }
        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setPreferredSize(new Dimension(320, 240));
        add(scrollPane);
        pack();
        setVisible(true);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new JTextAreaExample();
    }
}

Gruss Tom
 
Gut zu wissen, Thomas! :)

Diese Methode kannte ich noch garnicht, wird wohl wieder mal Zeit die Javadoc genauer durchzuschmökern... *schmunzel*
 
Danke an beide,

ich kann jetzt 300% korrekt einlesen und auslesen. Aber irgendwie schon komisch das eine JTextArea eine read() und eine write() Methode besitzt. Eine Guikomponente mit integrierten Streamfunktionen. Da nimmt ja Java einem die ganze Arbeit ab, da bleibt ja einem nichts mehr übrig zum selbst programmieren ;) .

Vg Erdal
 
Hi,
ich habe auch mal die Version vom Tom probiert und funktioniert auch so ganz gut. Aber leider bleibt das JScrollPane bei mir immer ganz oben stehen aber ich möchte, dass es immer nach unten scrollt.
Ich habe schon gefunden, das ich mit der JTextArea die Funktion setCaretPostion(xx) nutzen kann. Aber leider das auch nicht.
Wo kann das Problem liegen? Stört es, dass die Komponenten schon alle vorher angelegt sind?
 
Hallo Herr Klein von See,

hab dem Beispiel von Tom eine Zeile hinzugefügt. Das ScrollPane ist jetzt bis ganz unten gescrollt. Hier ist es wichtig das setCaretPosition nach dem setVisible() zu setzen.

Code:
import java.awt.Dimension;
import java.io.FileReader;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JTextAreaExample extends JFrame {

    public JTextAreaExample() {
        super("JTextAreaExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JTextArea textArea = new JTextArea();
        try {
            textArea.read(new FileReader("test.txt"), "");
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setPreferredSize(new Dimension(320, 240));
        
        //textArea.setCaretPosition(textArea.getText().length());
        
        add(scrollPane);
        
        //textArea.setCaretPosition(textArea.getText().length());
        
        pack();

        //textArea.setCaretPosition(textArea.getText().length());
        
        setVisible(true);
        
        textArea.setCaretPosition(textArea.getText().length());
    }

    public static void main(String[] args) {
        new JTextAreaExample();
    }
}

Hab das setCaretPosition an verschiedenen Stellen ausprobiert wie oben zu sehen ist. Nur letzteres hat gefunzzzt.

Vg Erdal
 

Neue Beiträge

Zurück