【问题标题】:Saving already existing file with added file extension not prompting overwrite message保存已存在的文件并添加文件扩展名不提示覆盖消息
【发布时间】:2015-04-22 15:50:05
【问题描述】:

对于我正在做的 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 并按保存,NO 会弹出覆盖提示,程序继续。这不是我想要的。我想弹出一个覆盖提示并警告用户。

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

这里有一些代码可以帮助你们理解:

...

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
}
...

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

【问题讨论】:

    标签: java swing jfilechooser overwrite


    【解决方案1】:

    覆盖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();
                }
            });
        }
    }
    

    【讨论】:

    • 我提前道歉;我对Java相当陌生。我了解压倒一切的方法,但我不确定这如何解决我的问题?我提示覆盖消息没有问题,只是当我尝试另存为existing_filename.config,注意.config,我没有收到消息。
    【解决方案2】:

    我遇到了相反的问题...如果用户不键入扩展名,它不会提示。如果用户没有输入,我稍后会添加扩展名。因此,在您的情况下,如果用户键入“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");
    

    【讨论】:

      猜你喜欢
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2013-05-02
      • 2017-02-10
      • 2023-02-01
      • 2015-03-10
      • 1970-01-01
      相关资源
      最近更新 更多