我正在使用JFileChooser来保存textArea中的数据,我想阻止用户在现有名称下保存他们的新文件。每次执行代码时,它只会提示用户一次更改他们试图保存的文件的名称。在输入新名称之前,我可以使用循环来阻止用户使用现有文件名?以下是我到目前为止的情况:
JButton OKSavebutton = new JButton("OK");
OKSavebutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
final JFileChooser fc = new JFileChooser();
final int result = JOptionPane.showConfirmDialog(fc, "Save new Observation Well File?", "Save File",
JOptionPane.OK_CANCEL_OPTION);
fc.setCurrentDirectory(new File("C:/Users/281925/Desktop/mads/User Saved Internal Contamination Problem/Observation Wells"));
FileNameExtensionFilter madsType = new FileNameExtensionFilter("MADS file (*.mads)", "mads");
fc.setFileFilter(madsType);
fc.addChoosableFileFilter(madsType);
fc.setAcceptAllFileFilterUsed(false);
int returnVal = fc.showSaveDialog(fc);
File f = new File(fc.getSelectedFile()+".mads");
switch(result){
case JOptionPane.OK_OPTION:
if (f.exists()){
int result1 = JOptionPane.showConfirmDialog(fc, "The file name exists. Please input new File name", "New File Name",
JOptionPane.OK_CANCEL_OPTION);
fc.showSaveDialog(fc);
}
try{
String fileExt = ".mads";
//create a buffered writer to write to a file
BufferedWriter out = new BufferedWriter(new FileWriter(fc.getSelectedFile().getPath() + fileExt));
out.write(textArea.getText());//write contents of the TextArea to the file
out.close();//close the file stream
}
catch(Exception e){ //catch any exceptions and write to the console
System.out.println(e.getMessage());
}
return;
case JOptionPane.CANCEL_OPTION:
fc.cancelSelection();
return;
default:
return;
}
}
});
我已经在这两天了,我真的需要帮助!!拜托,谢谢!
这是编辑过的代码。感谢@ luk2302的帮助。我确实需要调整一下,但现在它就像一个魅力:)
int result1 = fc.showSaveDialog(fc);
File f = new File(fc.getSelectedFile()+".mads");
/* loop until the user entered a file that does not exist yet */
while(f.exists()) {
result = JOptionPane.showConfirmDialog(fc, "The file name exists. Please input new File name", "New File Name", JOptionPane.OK_CANCEL_OPTION);
if(result == JOptionPane.OK_OPTION){
fc.showSaveDialog(fc);
}
/*Create new file and set it equal to f*/
File f1 = new File(fc.getSelectedFile() + ".mads");
f = f1;
}
/* return if user cancels */
if(result == JOptionPane.CANCEL_OPTION) {
fc.cancelSelection();
return;
}
/* if the user finally selected a non existing file do whatever needs to be done. */
if (result == JOptionPane.OK_OPTION) {
try {
String fileExt = ".mads";
//create a buffered writer to write to a file
BufferedWriter out = new BufferedWriter(new FileWriter(fc.getSelectedFile().getPath() + fileExt));
out.write(textArea.getText());//write contents of the TextArea to the file
out.close();//close the file stream
} catch(Exception e){ //catch any exceptions and write to the console
System.out.println(e.getMessage());
}
return;
}
答案 0 :(得分:1)
只需执行以下操作:
/* loop until the user entered a file that does not exist yet */
while(fc.getSelectedFile().exists()) {
result = JOptionPane.showConfirmDialog(fc, "The file name exists. Please input new File name", "New File Name", JOptionPane.OK_CANCEL_OPTION);
fc.showSaveDialog(fc);
/* return if user cancels */
if(result == JOptionPane.CANCEL_OPTION) {
fc.cancelSelection();
return;
}
}
/* if the user finally selected a non existing file do whatever needs to be done. */
if (result == JOptionPane.OK_OPTION) {
try {
String fileExt = ".mads";
//create a buffered writer to write to a file
BufferedWriter out = new BufferedWriter(new FileWriter(fc.getSelectedFile().getPath() + fileExt));
out.write(textArea.getText());//write contents of the TextArea to the file
out.close();//close the file stream
} catch(Exception e){ //catch any exceptions and write to the console
System.out.println(e.getMessage());
}
return;
}
另请注意,您指定了从未使用的int returnVal = fc.showSaveDialog(fc);
,而是在代码的其余部分中使用result
的值。所以将变量重命名为`
int result = fc.showSaveDialog(fc);`
答案 1 :(得分:1)
只需覆盖JFileChooser的approveSelection方法
JFileChooser fileChooser = new JFileChooser()
{
@Override
public void approveSelection()
{
File f = getSelectedFile();
if (f.exists() && getDialogType() == SAVE_DIALOG)
{
int result = JOptionPane.showConfirmDialog(this,
String.format("%s already exists.%n Overwrite?", f.getName()),
"File already exists", JOptionPane.YES_NO_OPTION);
switch (result)
{
case JOptionPane.YES_OPTION:
super.approveSelection();
return;
case JOptionPane.NO_OPTION:
return;
case JOptionPane.CLOSED_OPTION:
return;
case JOptionPane.CANCEL_OPTION:
cancelSelection();
return;
}
}
super.approveSelection();
}
};
答案 2 :(得分:0)
覆盖approveSelection()方法以阻止/确认:
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;
public class FileChooserSave
{
public static void main(String[] args)
{
final JFileChooser chooser = new JFileChooser( new File(".") )
{
public void approveSelection()
{
if (getSelectedFile().exists())
{
System.out.println("Do You Want to Overwrite File?");
}
else
super.approveSelection();
}
};
chooser.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println(e);
}
});
chooser.setSelectedFile( new File("something.rob") );
int returnVal = chooser.showSaveDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION)
{
System.out.println(chooser.getSelectedFile() );
}
}
}