使用 JFileChooser 保存
Posted
技术标签:
【中文标题】使用 JFileChooser 保存【英文标题】:Saving with a JFileChooser 【发布时间】:2012-03-16 01:28:43 【问题描述】:我使用JFileChooser
和showSaveDialoge()
和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 将 Icon 对象保存到文件中?