1

我正在使用 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;
          }
4

3 回答 3

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();
            }
        };
于 2015-01-29T07:31:56.573 回答
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);`

于 2013-07-11T22:17:52.677 回答
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() );
        }

    }
}
于 2013-07-12T15:04:58.897 回答