使用 JFileChooser 保存

Posted

技术标签:

【中文标题】使用 JFileChooser 保存【英文标题】:Saving with a JFileChooser 【发布时间】:2012-03-16 01:28:43 【问题描述】:

我使用JFileChoosershowSaveDialoge()setSelectionMode(JfileChooser.DIRECTORIES_ONLY) 来设置预选文件的保存位置和名称。

我希望用户能够选择新版本的名称以及放置位置。我该怎么做?我还想选择一个默认名称。

【问题讨论】:

请考虑将您的问题拆分成句子 从我对你的问题的了解来看,也许这会有所帮助docs.oracle.com/javase/tutorial/uiswing/components/… 如果是截止日期,我怀疑这是作业?如果是这样,您可能希望这样标记它。 我很好奇。你到底在编码什么? 我正在创建一个加密程序,它使用图像来加密文件,此保护程序采用 aes 加密,因此他们可以选择保存位置以及加密文件的名称,剩下的就完成了。 【参考方案1】:

我希望以下代码符合您的问题要求。代码注释中回答了您问题中的标准。如果您需要澄清,请告诉我。

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();             
            
        );
    


【讨论】:

【参考方案2】:

是的,这可以做到。显然,您需要在每次目录更改后使用属性更改侦听器来设置默认文件名。您还需要确保您正在使用 showSaveDialog() 并关闭仅目录选择模式(您希望他们在特定路径中选择文件名)

这是一些关于属性更改监听器部分的代码:

// 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();

   
);

此代码来自此处的示例:http://www.codeguru.com/forum/archive/index.php/t-38894.html

【讨论】:

【参考方案3】:

扩展对话框并添加所需的组件,例如版本条目(JComboBox),默认文件名字段(JTextField),您可以在其中设置默认名称,然后按 Ok ,获取所有组件选择的值,然后保存所需的值。

【讨论】:

以上是关于使用 JFileChooser 保存的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JFileChooser 保存 file.txt?

JFileChooser保存对话框建议文件名[重复]

JFileChooser - 自定义文件名(创建新文件)

如何通过 JFileChooser 将 Icon 对象保存到文件中?

如何在 JFileChooser 保存对话框中处理问号或星号(“?”或“*”)?

有没有办法用我的 JfileChooser 中选择的扩展来保存我的 bufferedImage?