JTextArea mit Zeilenumbrüchen auslesen

HISTORY

Mitglied
Hallo zusammen

Ich möchte eine JTextArea auslesen und das ganze in eine Datei speichern.
ich habe die Methode getText() ausprobiert.

Wie kann ich aber die Zeilenubrüche erkennen?
In der Datei schreibt es mir alles auf eine Zeile.

Sinn ist aber, dass ich die Datei mit der gleichen Formatierung wieder in meinem Programm öffnen kann.

Gibt es da noch andere Methoden oder was kann ich tun?
Code:
package nachricht;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

public class CreateNotiz extends JFrame implements ActionListener {
	private static final long serialVersionUID = 1L;

	JButton save = new JButton("Datei speichern");
	JButton newF = new JButton("Neues Dokument");

	JLabel label = new JLabel(
			"Schreiben Sie eine Notiz und speichern sie diese."
					+ " Die wird auf dem Homescreen der QuickLaunch sichtbar sein.");
	JLabel title = new JLabel("Titel: ");
	JLabel notiz = new JLabel("Notiz: ");
	JLabel leer = new JLabel();

	JTextArea textArea = new JTextArea(4, 60);
	JTextField titleField = new JTextField(30);

	JPanel panel = new JPanel();
	JPanel labelPanel = new JPanel();
	JPanel titlePanel = new JPanel();
	JPanel writePanel = new JPanel();
	JPanel buttonPanel = new JPanel();

	public CreateNotiz() {
		super("Neue Notiz");
		setBounds(500, 500, 800, 400);
		setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

		// Layouts definieren
		GridLayout gridCenter = new GridLayout(2, 1);
		writePanel.setLayout(gridCenter);
		titlePanel.setLayout(gridCenter);
		labelPanel.setLayout(gridCenter);

		// Kopf definiren
		titlePanel.add(title);
		titlePanel.add(titleField);
		labelPanel.add(label);
		labelPanel.add(titlePanel);

		// Scrollpane erstellen mitte adden
		textArea.setLineWrap(true);
		textArea.setWrapStyleWord(true);
		writePanel.add(notiz);
		writePanel.add(textArea);
		JScrollPane scrollBar = new JScrollPane(textArea,
				ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

		writePanel.add(scrollBar);

		// buttons adden

		save.addActionListener(this);
		newF.addActionListener(this);

		buttonPanel.add(save);
		buttonPanel.add(newF);

		// alles auf die Hauptpane
		panel.add(BorderLayout.NORTH, labelPanel);
		panel.add(BorderLayout.CENTER, writePanel);
		panel.add(BorderLayout.SOUTH, buttonPanel);

		add(panel);

		setResizable(false);
		setVisible(true);

	}

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

	public String giveTitle() {
		String docTitle;
		docTitle = titleField.getText();

		if (docTitle.length() == 0) {
			titleField.setText("doc1");
		}
		return docTitle;
	}

	public String getText() {
		String docText;
		docText = textArea.getText();

		if (docText.length() == 0) {
			textArea.setText("Der Inhalt dieses Dokuments wurde noch nicht definiert.");
		}

		docText = textArea.getText();
		return docText;
	}

	public void writeStream() {
		try {
			File file = new File(giveTitle() + ".quickLaunch");
			FileWriter writer = new FileWriter(file, false);

			writer.write(getText());
			writer.flush();

			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Object source = e.getSource();

		if (source == save) {
			writeStream();
			setTitle(giveTitle());

		} else if (source == newF) {
			titleField.setText("");
			textArea.setText("");
			setTitle("Neues Nachricht");
		}

	}

}

Sorry wegen dem Layout. Ich habs nicht so mit den LayoutManagern.

Gruss
HISTORY
 

Fabio Hellmann

Erfahrenes Mitglied
Hi,
also bei mir wird alles so in der Datei geschrieben, wie ich es in dem Textfeld reingetippt habe. Sprich auch den Zeilenumbruch.
Falls du den Zeilenumbruch in dem String finden willst, bzw. danach splitten, musst du nur folgendes machen:
Java:
String[] lines = text.split("\n");
Somit bekommst du alle Zeilen einzeln in einem Array.

Gruß

Fabio
 

HISTORY

Mitglied
Hallo Fabio

Ich habe es mal so versucht:

Java:
String [] lines;

	public String[] getText() {
		String docText;
		docText = textArea.getText();

		if (docText.length() == 0) {
			textArea.setText("Der Inhalt dieses Dokuments wurde noch nicht definiert.");
		} else {
			lines = docText.split("\n");
		}
		return lines;
	}

	public void writeStream() {
		try {
			File file = new File(giveTitle() + ".quickLaunch");
			FileWriter writer = new FileWriter(file, false);
			
			for (int i = 0; i < getText().length; i++){
				writer.write(getText()[i] + "\n" );
			}

			writer.flush();

			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

Leider funktioniert das ganze nicht wie geplant.

Eingabe:
erste Zeile \n
zweite Zeile \n
dritte Zeile \n

Eingabe:
Text_Editor.jpg

ausgbe im File: erste Zeile \n zweite Zeile \n dritte Zeile \n

Ausgabe:
result.gif

Kopiere ich den Text aus dem File ins Word wirds richtig dargestellt. Ist das so, weil \n in windos ein zeilenumbrich ist oder wie?

Wenn ich den Text "erste Zeile \n zweite Zeile \n dritte Zeile \n" in im Editor eintippe bekomme ich normalen plain Text ohne Zeilenumbrüche.



Könntes du mal ein Beispiel machen in welchem du eine JTextArea auslist und dies in ein File speicherst? Vielleicht könnte das mir so weiterhelfen.

Gruss Vielleicht
HISTORY
 

zerix

Hausmeister
Moderator
Hallo,

das sollte normal ohne Probleme funktionieren, den Text in einer Datei zu speichern.

Siehst du dir den Text im Notepad an, wenn du ihn in die Datei geschrieben hast?

Schau sie dir einfach mal im Wordpad an.

Das liegt daran, dass ein Zeilenumbruch unter Windows normal \r\n ist. Die JTextArea setzt den Zeilenumbruch aber wie unter Unix, nur \n. Das Notepad kann damit aber nichts anfangen und zeigt deshalb keinen Zeilenumbruch an. Das WordPad macht das aber.

Gruß

Sascha
 

HISTORY

Mitglied
Hallo zerix

Danke für die schnelle antwort. Das ist nun mein erstes "selbstständiges" java projekt das ich gerade mache. Das mit dem zeilenumbruch hatte ich vergessen. Wäre es dann nicht schon vorher gegangen, angenommen ich hätte is im worpad geöffnet?

Gruss

Marc