When you click save in this program , it is saved nicely but the txt file being saved is all in one line. How can i overcome this matter? Just FYI, when anyone try to save, dun forget the file extension (*.txt)

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.*;

import javax.swing.text.*;
import java.io.*;

 * Class <code>FileChooser</code> is used to demo opening and closing file.
 * @author  Mely
 * @version 1.73, 03/30/06
 * @see     javax.swing.filechooser.JFileChooser;
 * @since   JDK1.0
public class FileChooser extends JFrame {

    private JTextArea log;
    private static final JFileChooser fc = new JFileChooser();
    private static final String txt = ".txt";

    static {
        //Add a custom file filter and disable the default
        //(Accept All) file filter.
        //fc.addChoosableFileFilter(new TxtFilter());

    private String newline = System.getProperty("line.separator");

    public FileChooser() {

        setSize(400, 200);

        JButton openButton = new JButton("Open", new ImageIcon("images/open.gif")); //Create the open button and add image
        openButton.addActionListener(new OpenListener()); //Adds action listener to the open button

        JButton saveButton = new JButton("Save", new ImageIcon("images/save.gif")); //Create the save button and add image
        saveButton.addActionListener(new SaveListener()); //Adds action listener to the save button
        Dimension btnSize = new Dimension(100, 30);
        JPanel buttonPanel = new JPanel(); //Create a panel
        buttonPanel.add(openButton); //Add the open button to the panel
        buttonPanel.add(saveButton); //Add the save button to the panel

        log = new JTextArea(5,20); //Create the text area
        log.setMargin(new Insets(5,5,5,5)); //Set the margins
        JScrollPane logScrollPane = new JScrollPane(log);

        Container contentPane = getContentPane();
        contentPane.add(buttonPanel, BorderLayout.PAGE_START); //Add the buttons to the panel
        contentPane.add(logScrollPane, BorderLayout.CENTER); //Add the text area to the panel
    } //end of constructor

     * Find the hosting frame, for the file-chooser dialog.
     * @return  a frame of this parent.
    protected Frame getFrame() {
        for (Container p = getParent(); p != null; p = p.getParent())
            if (p instanceof Frame)
                return (Frame) p;
        return null;

    private class OpenListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int returnVal = fc.showOpenDialog(FileChooser.this);

            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();

                log.append("Opening: " + file.getName() + "." + newline); //Display "Opening" and the retrieved file name in the text area
            } else
                log.append("Open command cancelled by user." + newline); //Display this command in the text area
    } //end of class OpenListener

    private class SaveListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            int returnVal = fc.showSaveDialog(FileChooser.this);

            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();

                if (file.exists()) {
                    //default icon, custom title
                    int n = JOptionPane.showConfirmDialog(
                        "File already exists. Would you like to override it?",
                        "Override File?",

                    if (n == JOptionPane.NO_OPTION) {
                        //log.append("Save command cancelled by user. User do not wish to override it." + newline); //Display this command in the text area
                        JOptionPane.showMessageDialog(getFrame(),"Save command cancelled by user. User do not wish to override it.");
                } //end of if (file.exists())
                boolean isAcceptedExtension = fc.accept(file);

                if (!isAcceptedExtension) {
                    //Custom button text
                    Object[] options = {"Yes, please",
                                        "No, thanks",
                                        "Don't do anything"};
                    int n = JOptionPane.showOptionDialog(getFrame(),
                        "The file name does not have '.txt' extension.\n\n"
                        + "Would you like the program to append '.txt' to the filename on behalf of you?\n\n"
                        + String.format("<html><body>Changing filename from <span style='font-family: monospace'><font color=#ff0000>'%s'</font> to <font color=#ff0000>'%s.txt'</font></span></body></html>\n", file.getPath(), file.getPath()),
                        "A Confirmation Question",

                    if (n == JOptionPane.YES_OPTION) {
                        file = makeTxt(file);
                        isAcceptedExtension = true;
                } //end of if (!isAcceptedExtension)

                if (isAcceptedExtension) {
                    Thread saver = new FileSaver(file, log.getDocument());

                    //log.append("Saving: " + file.getName() + "." + newline); //Display "Saving" and the retrieved file name in the text area
                    JOptionPane.showMessageDialog(getFrame(),"Saving : " + file.getName() + ".");
                } else
                    //log.append("Saving Failed: " + file.getName() + " does not END with (.txt)." + newline); //Display "Saving" and the retrieved file name in the text area
                    JOptionPane.showMessageDialog(getFrame(),"Saving Failed....");
            } else
                log.append("Save command cancelled by user." + newline); //Display this command in the text area
    } // end of class SaveListener

    public static void main(String s[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FileChooser().setVisible(true);//Set frame to visible

     * Changed the extension to .txt if it has not done.
     * @param f file to be changed.
     * @return File that has been changed.
    private File makeTxt(File f) {
        return f.getName().endsWith(txt) ? f : new File(f.getPath().concat(txt));

     * Thread to save a document to file
    private class FileSaver extends Thread {
        private Document doc;
        private File f;

        FileSaver(File f, Document doc) {
            this.f = f;
            this.doc = doc;

        public void run() {
            JComponent status = new JPanel();
            JFrame frame = new JFrame("Saving...");
            try {

                // initialize the statusbar
                JProgressBar progress = new JProgressBar();
                progress.setMaximum((int) doc.getLength());

                Container c = frame.getContentPane();
                c.setLayout(new BoxLayout(c, BoxLayout.PAGE_AXIS));
                c.add(new JLabel(String.format("Saving file '%s' in '%s'", f.getName(), f.getPath())));
                c.add(new JLabel("Please wait..."));


                // start writing
                Writer out = new FileWriter(f);
                Segment text = new Segment();
                int charsLeft = doc.getLength();
                int offset = 0;
                while (charsLeft > 0) {
                    doc.getText(offset, Math.min(4096, charsLeft), text);
                    out.write(text.array, text.offset, text.count);
                    charsLeft -= text.count;
                    offset += text.count;
            } catch (IOException e) {
                final String msg = e.getMessage();
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                                "Could not save file: " + msg,
                                "Error saving file",
            } catch (BadLocationException e) {
            // we are done... get rid of progressbar
    }  // end of class FileSaver

     * Waiting for the human's eye to grasp the information.
    private static final void halt(int ms) {
        try {
        } catch (InterruptedException exception) {
            System.err.println("Thread had been interrupted..");
}  // end of FileChooser

Recommended Answers

All 2 Replies

You would just add "\n" to the String you are outputting whenever you want it to go to the next line. Is this even your code? That seems awfully simple to not know for such a complicated piece of code, so maybe I misunderstood your question.

Not completely my code...
I got it from my lecturer and i edit some parts but honestly about file i/o m still bit blur, that's why...
However..i wil try first..Thank you :-)

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, learning, and sharing knowledge.