Hilfe beim Ein - und Auslesen einer Textdatei

IZZO

Mitglied
Hallo Leute!

ich habe lange im Internet gesucht aber finde keine Lösung. Ich möchte gerne eine Textdatei erstellen, einlesen von einem JTextArea aus und nach erneutem Programmstart soll die Textdatei ausgelesen werden und das JTextArea damit gefüllt werde. Das mit dem einlesen usw. klappt wunderbar nur beim Auslesen haperts. Genauer gesagt in Zeile 119. Dort unterstreicht er mir die Variable, meint er kenne die nicht obwohl ich sie doch als Klassenvariable definiert ist.

Ignoriert meine Kommentare im Code sind teilweise falsch und/oder noch nicht aktualisiert.

Hier der Code

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;




public class IzIProg extends JFrame implements ActionListener {
		//Die Variable neuframe (welche ein JFrame ist) wird angelegt und die Farbe "bla" (rgb) definiert
		JFrame neuframe = new JFrame();
		JTextArea textfeld = new JTextArea();
		Color bla = new Color (200, 10, 20);
		JFrame frame = new JFrame();
		JButton button = new JButton("Druecken");
		JButton neubutton = new JButton("Speichern");
		
		
	
		public IzIProg() {
		
		//Hier wird das Hauptfenster "frame" erstellt
		
		frame.setTitle("GEH");
		frame.setBounds(300, 100, 800, 800);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(null);
		frame.setVisible(true);
		//Hier wird der Button "Druecken" erstellt
		button.setBounds(350, 375, 100, 50);
		button.setBackground(bla);
		button.addActionListener(this);
		//Hier wird der Button "Druecken" dem Fenster "frame" hinzugefügt
		frame.add(button);
	}
	
	public void actionPerformed(ActionEvent e) {

		if(e.getActionCommand().equals("Druecken")){
				neuframe();
				if (!neuframe.isShowing()){
					neuframe.setVisible(true);
				}
				else {
		//Der Fehlerdialog wird erstellt
							JOptionPane.showMessageDialog(
							neuframe, "Sie können das Fenster nicht zweimal öffnen",
						    "Das Fenster ist schon offen",
						    JOptionPane.ERROR_MESSAGE);
							
					
				}
				
			}
		
		
		String strg = textfeld.getText();
		
		if(e.getActionCommand().equals("Speichern")){
			
			
			try
			{
				File file = new File("C:/geh/hallo.txt");
				FileWriter fw = new FileWriter(file);
				
				fw.write(strg);
				
				fw.flush();
				fw.close();
				
			}
			catch( IOException ioe )
			{
				ioe.printStackTrace();
			} 
		}
		}
	
		//Methode "neuframe"
	public void neuframe() {
		
		
		neuframe.setSize(400, 400);
		neuframe.setLayout(null);
		neuframe.setResizable(true);
		neuframe.setTitle("2. Fenster");
		
		neubutton.setBounds(50, 50, 100, 50);
		neubutton.addActionListener(this);
		neuframe.add(neubutton);
		
		

		textareaerstellen();

	}
	
	public void textareaerstellen() {

		textfeld.setBounds(0, 200, 200, 50);
		textfeld.setLineWrap(true);
        textfeld.setWrapStyleWord(true);
        textfeld.setText(strg);
       
        
        
        
        
        JScrollPane pane = new JScrollPane(textfeld);
        pane.setBounds(200, 200, 100, 100);
        neuframe.add(pane);
        
        
        
        
        
       
	}
	


	public static void main(String[] args) {
		//ein Objekt der Klasse IzIProg wird erzeugt
		new IzIProg();
		
	}

}
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

du definierst "strg" innerhalb deiner actionPerformed() Methode, somit ist die Variable auch nur dort drin verfügbar.

Grüße,
BK
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

was meinst du mit "geht gar nichts mehr"? Eine Exception? Schon debuggt an der Stelle wo er "was machen" soll?

Grüße,
BK
 

IZZO

Mitglied
Damit meine ich, dass der Text nicht mehr eingespeichert wird. Nur wenn die Variable strg in der actionPerformed() methode drinnsteht dann wird der text immerhin eingespeichert. Das Auslesen krieg ich leider gar nicht hin
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

ja, wenn du strg als Klassenvariable deklarierst und initialisierst, dann bekommt sie einmal den Wert vom Textfeld. Und das wenn die Klasse erstellt wird. Du musst die Variable schon aktualisieren ;)

Hier mal mein Ansatz (braucht Java 7):
Java:
package de.tutorials.bratkartoffel;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

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

public class DateiEditor extends JFrame {
	private static final long serialVersionUID = 1L;

	private final JButton button = new JButton("Speichern");
	private final JTextArea txtFeld = new JTextArea();
	private final File file = new File("test.txt");

	public static void main(final String[] args) {
		new DateiEditor().setVisible(true);
	}

	public DateiEditor() {
		setSize(500, 300);
		setLayout(new BorderLayout());
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(final ActionEvent event) {
				DateiEditor.this.save();
			}
		});

		if (file.exists()) {
			load();
		}

		add(new JScrollPane(txtFeld), BorderLayout.CENTER);
		add(button, BorderLayout.SOUTH);
	}

	private void load() {
		try (FileInputStream br = new FileInputStream(file)) {
			byte[] result = new byte[(int) file.length()];

			br.read(result);

			txtFeld.setText(new String(result));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void save() {
		try (FileOutputStream fos = new FileOutputStream(file)) {
			fos.write(txtFeld.getText().getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Grüße,
BK