取消选择JFileChooser中的文件而不关闭对话框

时间:2013-05-08 16:52:54

标签: java swing joptionpane jfilechooser save-as

我正在尝试使用JFileChooser实现“另存为”对话框。对话框应该让用户能够输入文件名并单击“保存”,此时将返回并创建新的File对象。

这有效,但当我尝试添加另一个对话时,我遇到了问题。具体来说,我想创建一个“文件已存在”对话框,使用JOptionPane来警告用户他们是否正在尝试创建一个与预先存在的文件同名的文件(这是许多人的常见功能)程式)。对话框提示"File <filename> already exists. Would you like to replace it?" (Yes/No)。如果用户选择“是”,则应该正常返回文件对象。如果用户选择“否”,则JFileChooser 应保持打开并等待选择/创建另一个文件。

问题是我找不到取消选择的方法(如果用户选择“否”)保持对话框打开。我有代码:

public void saveAs()
{
    if (editors.getTabCount() == 0)
    {
        return;
    }

    final JFileChooser chooser = new JFileChooser();

    chooser.setMultiSelectionEnabled(false);

    chooser.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent arg0)
        {
            File f =  chooser.getSelectedFile();

            if (f.exists())
            {
                int r = JOptionPane.showConfirmDialog(
                     chooser,
                     "File \"" + f.getName() +
                     "\" already exists.\nWould you like to replace it?",
                     "",
                     JOptionPane.YES_NO_OPTION);    

                //if the user does not want to overwrite
                if (r == JOptionPane.NO_OPTION)
                {
                    //cancel the selection of the current file
                    chooser.setSelectedFile(null);
                }
            }
        }
    });

    chooser.showSaveDialog(this);

    System.out.println(chooser.getSelectedFile());
}

如果用户选择“no”(即对话结束后所选文件为null),则成功取消选择文件。但是,它也会在之后立即关闭对话。

如果对话在发生这种情况时保持开放,我更愿意这样做。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

覆盖approveSelection()方法。类似的东西:

JFileChooser chooser = new JFileChooser( new File(".") )
{
    public void approveSelection()
    {
        if (getSelectedFile().exists())
        {
            System.out.println("Do You Want to Overwrite File?");
            // Display JOptionPane here.  
            // if yes, super.approveSelection()
        }
        else
            super.approveSelection();
    }
};

答案 1 :(得分:0)

如果他们不想覆盖文件,也许你可以再简单地重新打开JFileChooser。

该对话框将具有与之前相同的目录,因此用户无需再次导航。