Speichern von Text macht Probleme

Wäre nett wenn jemand mir per PM mal das erklärt? z.B. über skype (Wenn ich HIER (im Forum) on bin).

Mit freundlichem Gruß,
MrSmile07

Hallo,

das sind Grundlagen, die überall zu finden sind.

Konzentriere dich erstmal auf Lesen und Schreiben einer Datei.

Google: Read and Write Files with Java

Gruß,

Martin

Ein ganz einfaches Bespiel:
http://stackoverflow.com/questions/5880169/loading-a-text-file-into-a-textarea?answertab=active#tab-top

Ein User hat mir geholfen. Hier der Code:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;

public class Document extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;
    private JTextArea ta;   
    
    private String pad;
    

    public Document() {
        super("Document");
        setSize(600, 600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container pane = getContentPane();
        pane.setLayout(new BorderLayout());

        /*
         * try { BufferedImage img =
         * ImageIO.read(this.getClass().getResourceAsStream("logo.png"));
         * setIconImage(img); } catch (IOException e) { e.printStackTrace(); }
         */

        pad = " ";
        ta = new JTextArea(); // textarea
        JMenuBar menuBar = new JMenuBar(); // menubar
        JMenu fileM = new JMenu("File"); // file menu
        JMenu editM = new JMenu("Edit"); // edit menu
        JMenu viewM = new JMenu("View"); // edit menu
        JScrollPane scpane = new JScrollPane(ta); // scrollpane and add textarea to
                                        // scrollpane
        JMenuItem exitI = new JMenuItem("Exit");
        JMenuItem cutI = new JMenuItem("Cut");
        JMenuItem copyI = new JMenuItem("Copy");
        JMenuItem pasteI = new JMenuItem("Paste");
        JMenuItem selectI = new JMenuItem("Select All"); // menuitems
        JMenuItem saveI = new JMenuItem("Save"); // menuitems
        JMenuItem loadI = new JMenuItem("Load"); // menuitems
        JMenuItem statusI = new JMenuItem("Status"); // menuitems
        JToolBar toolBar = new JToolBar();

        ta.setLineWrap(true);
        ta.setWrapStyleWord(true);

        setJMenuBar(menuBar);
        menuBar.add(fileM);
        menuBar.add(editM);
        menuBar.add(viewM);

        fileM.add(saveI);
        fileM.add(loadI);
        fileM.add(exitI);

        editM.add(cutI);
        editM.add(copyI);
        editM.add(pasteI);
        editM.add(selectI);

        viewM.add(statusI);

        saveI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
                ActionEvent.CTRL_MASK));
        loadI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L,
                ActionEvent.CTRL_MASK));
        cutI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
                ActionEvent.CTRL_MASK));
        copyI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
                ActionEvent.CTRL_MASK));
        pasteI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
                ActionEvent.CTRL_MASK));
        selectI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
                ActionEvent.CTRL_MASK));

        pane.add(scpane, BorderLayout.CENTER);
        pane.add(toolBar, BorderLayout.SOUTH);

        saveI.addActionListener(this);
        saveI.setActionCommand("saveI");
        loadI.addActionListener(this);
        loadI.setActionCommand("loadI");
        exitI.addActionListener(this);
        exitI.setActionCommand("exitI");
        cutI.addActionListener(this);
        cutI.setActionCommand("cutI");
        copyI.addActionListener(this);
        copyI.setActionCommand("copyI");
        pasteI.addActionListener(this);
        pasteI.setActionCommand("pasteI");
        selectI.addActionListener(this);
        selectI.setActionCommand("selectI");
        statusI.addActionListener(this);
        statusI.setActionCommand("statusI");

        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();

        if (command.equals("saveI")) {
            clickSave();
        } else if (command.equals("exitI")) {
            System.exit(0);
        } else if (command.equals("cutI")) {
            pad = ta.getSelectedText();
            ta.replaceRange("", ta.getSelectionStart(), ta.getSelectionEnd());
        } else if (command.equals("copyI")) {
            pad = ta.getSelectedText();
        } else if (command.equals("pasteI")) {
            ta.insert(pad, ta.getCaretPosition());
        } else if (command.equals("selectI")) {
            ta.selectAll();
        } else if (command.equals("loadI")) {
            clickOpen();
        } else if (command.equals("statusI")) {
            // not yet implmented
        }
    }

    private void clickOpen() {
        JFileChooser fileChooser = getFileChooser();

        int state = fileChooser.showOpenDialog(this);

        if (state == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            openFile(file.getAbsolutePath());
        }

    }

    private void openFile(String absolutePath) {
        StringBuilder text = new StringBuilder("");
        try {
            Scanner input = new Scanner(new File(absolutePath));

            while (input.hasNextLine()) {
                text.append(input.nextLine()).append("
");
            }

            input.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        ta.setText(text.toString());

    }

    private JFileChooser getFileChooser() {
        JFileChooser fileChooser = new JFileChooser(new File(""));// <---
                                                                    // startDirectory

        fileChooser.addChoosableFileFilter(getFileFilter("txt", "Textdateien"));
        fileChooser
                .addChoosableFileFilter(getFileFilter("song", "Songdateien"));
        fileChooser.addChoosableFileFilter(getFileFilter("xml", "XML-Dateien"));

        return fileChooser;
    }

    public FileFilter getFileFilter(final String suffix, final String text) {
        return new FileFilter() {
            @Override
            public boolean accept(File f) {
                String name = f.getName();
                return name.endsWith(suffix);
            }

            @Override
            public String getDescription() {
                return text;
            }
        };
    }

    private void clickSave() {
        JFileChooser fileChooser = getFileChooser();

        int state = fileChooser.showSaveDialog(this);

        if (state == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            saveFile(file.getAbsolutePath());
        }
    }

    public void saveFile(String path) {
        String text = ta.getText();
        System.out.println(text);
        try {
            File file = new File(path);
            if (file.exists()) {
                System.out.println("Datei existiert schon!");
            }

            BufferedWriter bw = new BufferedWriter(new FileWriter(file));
            String newLine = System.getProperty("line.separator");
            bw.write(text.replace("
", newLine));
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

Danke aber für alle Bemühungen.

Mit freundlichem Gruß,
MrSmile07

Wenn du längerfristig mit Java arbeiten willst, wirst du aber nicht darum herum kommen, dir die grundlegenden Mechanismen zu erarbeiten.

Als fertig würde ich den Code aber trotzdem nicht einstufen, falls es funktioniert ist ok, für die Feinheiten sollte man sich aber auch die Zeit nehmen:

public class Document extends JFrame implements ActionListener {
Klassische Basis einer Mutantenklasse. Später kommen gerne noch KeyListener oder Runnable dazu.
Du überschreibst keine einzige Methode von JFrame, leg dir das JFrame also als private Variable an, dann sparst du dir auch den Mist mit der serialVersionUID.

Zu dem Actionlistener:

String command = e.getActionCommand();
 
if (command.equals("saveI")) {
clickSave();
} else if (command.equals("exitI")) {
System.exit(0);
} else if (command.equals("cutI")) {
pad = ta.getSelectedText();
ta.replaceRange("", ta.getSelectionStart(), ta.getSelectionEnd());
} else if (command.equals("copyI")) {
pad = ta.getSelectedText();
} else if (command.equals("pasteI")) {
ta.insert(pad, ta.getCaretPosition());
} else if (command.equals("selectI")) {
ta.selectAll();
} else if (command.equals("loadI")) {
clickOpen();
} else if (command.equals("statusI")) {
// not yet implmented
}
}```

Erstmal sollte das auch nicht direkt in die Klasse (die hat andere Aufgaben und sollte nicht von ActionListener erben). Dann ist der Listener an sich wieder ein Mutant, du müsstest für jede Änderung an den Buttons immer wieder die Klasse anfassen.
mach das ganze lieber mit einem ActionListener pro Button, da kann man mit anonymen Klassen anfangen und bei Bedarf wieder Klassen extrahieren, auslagern oder abstrahieren.

Mit anonymen Klassen könnte das so aussehen:
```saveI.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				clickSave();
			}
		});
		loadI.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				clickOpen();
			}
		});
		exitI.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		cutI.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				pad = ta.getSelectedText();
				ta.replaceRange("", ta.getSelectionStart(),
						ta.getSelectionEnd());
			}
		});
		copyI.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				pad = ta.getSelectedText();
			}
		});
		pasteI.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				ta.insert(pad, ta.getCaretPosition());
			}
		});
		selectI.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				ta.selectAll();
			}
		});
		statusI.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// not yet implmented
			}
		});```
In der Form benötigst du auch keine Strings mehr als Kennung (die man im übrigen auch falsch schreiben kann -> ergibt eine hässliche Fehlersuche).

Zum Einlesen:
Der StringBuilder kann mit `new StringBuilder();` erstellt werden.
Als Zeilenumbruch kann man auch hier direkt `System.getProperty("line.separator")` oder (ich glaube ab Java 7) `System.lineSeparator()` verwenden.

Zum Speichern:
Man kann auch einen String zeilenweise lesen, [JAPI]BufferedReader [/JAPI]in Kombination mit [JAPI]StringReader [/JAPI]sollten das gewünschte tun.
Benutzt man zum schreiben einen [JAPI]PrintWriter [/JAPI]spart man sich auch das Gefrickel mit den Linefeeds.

Kleiner Hinweis zu den JFileChooser:
Wenn du die Chooser als Felder anlegst und nicht pro Aufruf neu erstellst "merken" sie sich das letzte Verzeichnis in dem der Benutzer war.
Ein Feature, dass die meisten Benutzer intuitiv erwarten. Die Methode getFileFilter könnte man privat und/oder static machen.

Zum JFrame:
Du musst nicht den Umweg über die ContentPane gehen.
Setzt du das Layout direkt auf einem JFrame-Objekt, oder fügst du per .add() Komponenten hinzu, leitet das JFrame die Aufrufe intern an die ContentPane weiter.

Gruß