保存已添加文件扩展名的现有文件,不提示覆盖邮件

时间:2015-02-20 20:50:06

标签: java swing jfilechooser overwrite

对于我正在做的GUI项目,我正在尝试很好地保存机制。我目前正致力于覆盖文件,而且我遇到了一些问题。

这是我创建的测试用例:

Save current file using Save As. When prompted for a file name, give an existing file name with an added file extension.

假设已调用已存在的文件:test.config

如果我输入:test并按保存,会弹出一个覆盖提示,这就是我想要的。

如果我输入:test.config并按保存,则会弹出覆盖提示,然后程序继续。这不是我想要的。我想要一个覆盖提示弹出并警告用户。

我一直在搜索各种网站和Javadocs for Files,如果用户输入额外的扩展名,我似乎无法弄清楚该文件是否存在。

以下是一些可能有助于您理解的代码:

...

int returnVal = fc.showSaveDialog(Dialogc.this);
if(returnVal != JFileChooser.APPROVE_OPTION) {
        JOptionPane.showMessageDialog(null,
            "Error saving file. \nFile not saved.");
        return 1;
}

// Get file name
file = fc.getSelectedFile();

/* Check if file exists */
if(file.exists()) {
    JOptionPane.showConfirmDialog(null, 
        "File already exists. Overwrite?", "Overwrite Prompt",  
        JOptionPane.YES_NO_OPTION);
}
else {
    // If it doesn't exist, create new file
}
...

注意:我确实有添加或删除扩展程序的方法。我应该使用这些来帮助检查给定文件是否已经存在吗?

2 个答案:

答案 0 :(得分:2)

重写approveSelection(...)方法以确认文件的覆盖:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;

public class FileChooserSave
{
    private static void createAndShowUI()
    {
        final JFileChooser chooser = new JFileChooser( new File(".") )
        {
            public void approveSelection()
            {
                if (getSelectedFile().exists())
                {
                    int n = JOptionPane.showConfirmDialog(
                        this,
                        "Do You Want to Overwrite File?",
                        "Confirm Overwrite",
                        JOptionPane.YES_NO_OPTION);

                    if (n == JOptionPane.YES_OPTION)
                        super.approveSelection();

                }
                else
                    super.approveSelection();
            }
        };

        chooser.setSelectedFile( new File("something.rob") );
        int returnVal = chooser.showSaveDialog(null);


        if(returnVal == JFileChooser.APPROVE_OPTION)
        {
           System.out.println(chooser.getSelectedFile() );
        }
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

答案 1 :(得分:0)

我遇到了相反的问题...如果用户没有输入扩展名,则不会提示。如果用户没有输入,我稍后会添加扩展名。因此,如果用户输入“test”,我的代码会将文件保存为“test.config”。我假设你的工作方式相同吗?

为了解决这个问题,我还必须在批准期间添加扩展程序......首先:

final JFileChooser fc = new JFileChooser(){
@Override
public void approveSelection(){

    File f = getSelectedFile();
            String filestring = f.toString();

            String[] left_side_of_dot = filestring.split("\\.");

             f = new File(left_side_of_dot[0] + ".config");


    if(f.exists() && getDialogType() == SAVE_DIALOG){
        int result = JOptionPane.showConfirmDialog(YOUR_Frame,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_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();
 }
};

然后也在保存之前:

String noxtfilename = filename.substring(0, filename.length()-7);
    File file = new File(noxtfilename);
    fc.setSelectedFile(file); }
 FileNameExtensionFilter filefilter = new  FileNameExtensionFilter("Config File (*.config)","config");

 fc.setFileFilter(filefilter);


    int returnVal = fc.showSaveDialog(YOUR_Frame);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            String filestring = file.toString();

            String[] left_side_of_dot = filestring.split("\\.");

             file = new File(left_side_of_dot[0] + ".config");