Saving with a JFileChooser

為{幸葍}努か 提交于 2019-12-04 18:30:19

I hope the codes below implemented inline with your question requirements. The criteria in your question are answered in the code comment. If you need clarification, please let me know.

import java.awt.BorderLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class MyFileChooser extends JPanel implements ActionListener
{
    JButton saveButton;
    JTextArea content;
    JFileChooser jfc;

    private boolean docUpdate = false;
    private String default_filename = "default.txt";
    private String default_directory = "/home/foo/workspace";
    private int version = 0; 

    public MyFileChooser()
    {
        super(new BorderLayout());

        content = new JTextArea(5, 20);
        content.setMargin(new Insets(5, 5, 5, 5));
        content.getDocument().addDocumentListener(new DocumentListener()
        {

            @Override
            public void removeUpdate(DocumentEvent e)
            {
                System.out.println("remove update");
                docUpdate = true;               
            }

            @Override
            public void insertUpdate(DocumentEvent e)
            {
                System.out.println("insert update");
                docUpdate = true;
            }

            @Override
            public void changedUpdate(DocumentEvent e)
            {
                System.out.println("changed update");
                docUpdate = true;               
            }
        });
        JScrollPane logScrollPane = new JScrollPane(content);

        jfc = new JFileChooser();

        /**
         * Set a initial default directory and a initial default filename here. 
         */
        //fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        jfc.setCurrentDirectory(new File(default_directory));
        jfc.setSelectedFile(new File(default_filename));
        jfc.addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt)
            {               
                if (docUpdate == true)
                {
                    /**
                     * User can use the suggested filename or remove the suggested,
                     * and enter a new filename.
                     * Here, we set to a new directory and of cause, user can select
                     * what is the directory he want.
                     */
                    jfc.setCurrentDirectory(new File("/home/foo"));
                    jfc.setSelectedFile(new File("default" + version + ".txt"));
                }               
            }
        });

        saveButton = new JButton("Save a File...");
        saveButton.addActionListener(this);

        JPanel buttonPanel = new JPanel(); 
        buttonPanel.add(saveButton);

        add(buttonPanel, BorderLayout.PAGE_START);
        add(logScrollPane, BorderLayout.CENTER);        
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {

        int returnVal = jfc.showSaveDialog(MyFileChooser.this);
        if (returnVal == JFileChooser.APPROVE_OPTION)
        {
            File file = jfc.getSelectedFile();
            // save the file.
            BufferedWriter bw;
            try {
                bw = new BufferedWriter(new FileWriter(file));
                bw.write(content.getText());
                bw.flush();
            }               
            catch (IOException e1)
            {
                e1.printStackTrace();
            }
            version++;

        }
        else
        {
            System.out.println("Save command cancelled by user. ");
        }
        content.setCaretPosition(content.getDocument().getLength());

    }

    private static void createAndShowGUI()
    {       
        JFrame frame = new JFrame("FileChooserDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(new MyFileChooser());

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {

            @Override
            public void run() 
            {
                createAndShowGUI();             
            }
        });
    }

}

Yes, this can be done. Apparently you need to use a property change listener to set the default file-name after each directory change. You will also want to make sure you are using showSaveDialog() and turn off directory only selection mode (you want them to pick a filename in a particular path)

Here is some code about the property change listener part:

// create a new FileChooser
chooser = new JFileChooser();

String defaultFileName = "del.txt"

// add listener to filter changes
chooser.addPropertyChangeListener(JFileChooser.DIRECTORY_CHANGED_PROPERTY,
new PropertyChangeListener() {
    public void propertyChange(PropertyChangeEvent evt) {

        chooser.setSelectedFile(
            new File(chooser.getCurrentDirectory().getAbsolutePath() +
                "\\" + defaultFileName));


       chooser.updateUI();

   }
});

This code is from the example here: http://www.codeguru.com/forum/archive/index.php/t-38894.html

Extend the Dialog and add your required components like an entry for version( JComboBox) , default File name field (JTextField) where you set the default name and on pressing Ok , fetch all the components selected values and then save your required.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!