当前位置: 首页 > 知识库问答 >
问题:

JFileChooser“另存为”复合文档-覆盖现有文档

施超
2023-03-14

我的问题是“另存为”对话框。如果我保存为一个不存在的复合文档,那么一切都很好。如果我双击一个现有的复合文档,那么我的代码会询问您是否要覆盖它,这也很好。

但是,错误的是,如果您键入现有复合文档的名称并单击save,它就像您单击cancel一样。

我使用FileFilter和FileView来配置所有文件的显示和过滤。

public void saveAs() {
    JFileChooser fc = new JFileChooser();
    javax.swing.filechooser.FileFilter filter = new SketchFolderFilter();
    fc.setFileFilter(filter);

    javax.swing.filechooser.FileView view = new SketchFileView();
    fc.setFileView(view);

    fc.setCurrentDirectory(Base.getSketchbookFolder());

    int rv = fc.showSaveDialog(this);

    System.err.println("Option: " + rv);
    if (rv == JFileChooser.APPROVE_OPTION) {
        File newFile = fc.getSelectedFile();
        System.err.println("Save As: " + newFile.getAbsolutePath());
        if (newFile.exists()) {
            int n = twoOptionBox(
                JOptionPane.WARNING_MESSAGE,
                "Overwrite File?",
                Translate.w("Do you really want to overwrite the file %1?", 40, "\n", newFile.getName()),
                "Yes", "No");
            if (n != 0) {
                return;
            }
            newFile.delete();
        }
        loadedSketch.saveAs(newFile);
    }
}
public class SketchFileView extends javax.swing.filechooser.FileView {
    public String getTypeDescription(File f) {
        if (Base.isSketchFolder(f)) {
            return Translate.t("UECIDE Sketch Folder");
        }
        return Translate.t("Directory");
    }

    public Boolean isTraversable(File f) {
        if (Base.isSketchFolder(f)) {
            return false;
        }
        return true;
    } 

    public Icon getIcon(File f) {
        if (Base.isSketchFolder(f)) {
            ImageIcon icon = Base.loadIconFromResource("icon16.png");
            return icon;
        }
        return null;
    }
}

public class SketchFolderFilter extends javax.swing.filechooser.FileFilter {
    public boolean accept(File f) {
        if (Base.isSketchFolder(f)) {
            return true;
        }
        if (f.isDirectory()) {
            return true;
        }
        return false;
    }

    public String getDescription() {
        return Translate.t("Sketch Folders");
    }
}
Option: 0
Save As: /foo/bar/baz
Option: 1
    null

(无论如何,在我看来)这是错误的。它应该返回APPROVE_OPTION,getSelectedFile()应该返回一个文件对象,该对象表示您在JFileChooser所在的目录中键入的文件(即,与3相同)。

缩小范围。当一个文件夹不可遍历时,JFileChooser似乎不喜欢它,您在选择器中输入它的名称并单击return-它试图遍历它,但它失败了,并且不知道如何处理它,所以只是将您从返回0的JFileChooser中转储。下面的SSCE演示了它。在一个文件夹中有一个名为“test.x”的文件夹,然后键入“test.x”。应该会失败。

import java.io.*;
import javax.swing.*;


class fctest {

    public class SketchFileView extends javax.swing.filechooser.FileView {
        public Boolean isTraversable(File f) {
            if (f.getName().endsWith(".X")) {
                return false;
            }
            if (f.isDirectory()) {
                return true;
            }
            return true;
        } 
    }

    public class SketchFolderFilter extends javax.swing.filechooser.FileFilter {
        public boolean accept(File f) {
            if (f.getName().endsWith(".X")) {
                return true;
            }
            if (f.isDirectory()) {
                return true;
            }
            return false;
        }

        public String getDescription() {
            return "Sketch Folders";
        }
    }

    public void saveAs() {
        JFileChooser fc = new JFileChooser();
        javax.swing.filechooser.FileFilter filter = new SketchFolderFilter();
        fc.setFileFilter(filter);

        javax.swing.filechooser.FileView view = new SketchFileView();
        fc.setFileView(view);

        fc.setCurrentDirectory(new File("."));

        int rv = fc.showSaveDialog(null);

        System.err.println("Option: " + rv);
        if (rv == JFileChooser.APPROVE_OPTION) {
            File newFile = fc.getSelectedFile();
            System.err.println("Save As: " + newFile.getAbsolutePath());
        }
    }

    public static void main(String[] args) {
        fctest main = new fctest();
        main.saveAs();
    }
}

共有1个答案

甄云
2023-03-14

如果键入现有复合文档的名称并单击保存,则其行为与单击取消类似。

我想您的意思是文件选择器关闭,但您希望它保持打开,以便用户有机会更改文件名。如果是,则可以重写JFileChooser的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();
            }
        });
    }
}

编辑:

fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
import java.io.*;
import javax.swing.*;


class fctest {

    public class SketchFileView extends javax.swing.filechooser.FileView
    {
        @Override
        public Boolean isTraversable(File f) {
            if (f.getName().startsWith("images")) {
                return false;
            }
            if (f.isDirectory()) {
                return true;
            }
            return false; // added this
        }
    }

    public class SketchFolderFilter extends javax.swing.filechooser.FileFilter {
        public boolean accept(File f) {
            if (f.getName().startsWith("images")) {
                return true;
            }
            if (f.isDirectory()) {
                return true;
            }
            return false;
        }

        public String getDescription() {
            return "Sketch Folders";
        }
    }

    public void saveAs() {
        JFileChooser fc = new JFileChooser()
        {
            public void approveSelection()
            {
                if (getSelectedFile().getName().startsWith("images"))
                    super.approveSelection();
            }
        };

        javax.swing.filechooser.FileFilter filter = new SketchFolderFilter();
        fc.setFileFilter(filter);

        javax.swing.filechooser.FileView view = new SketchFileView();
        fc.setFileView(view);

//      fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        fc.setCurrentDirectory(new File("."));
        fc.setSelectedFile( new File("blog") );

        int rv = fc.showSaveDialog(null);

        System.err.println("Option: " + rv);
        if (rv == JFileChooser.APPROVE_OPTION) {
            File newFile = fc.getSelectedFile();
            System.err.println("Save As: " + newFile.getAbsolutePath());
        }
    }

    public static void main(String[] args) {
        fctest main = new fctest();
        main.saveAs();
    }
}
 类似资料:
  • 问题内容: 这个: 在html中调用,例如: 向div元素添加一个字符串。正是我想要的。但是,这: 这样称呼: 似乎正在覆盖我的整个html文件。即,当我在Firefox中运行它时,它仅显示字符串(即页面的全部内容),但页面似乎仍在加载(FF的加载图标仍在进行动画显示,显然是无限的)。 首先,这将仅在本地,离线使用,作为呈现数据的快速便捷方式(使用html + js和网络浏览器而不是纯文本文件)。

  • 本文向大家介绍如何在不覆盖现有文档的情况下更新MongoDB文档?,包括了如何在不覆盖现有文档的情况下更新MongoDB文档?的使用技巧和注意事项,需要的朋友参考一下 要仅更新字段值,请使用update()和$set。这不会覆盖现有的。首先让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是更新文档而不覆盖现有文档的查询- 在find()方法

  • 我正在使用Azure Blob存储来上传/下载文件。问题是,如果我上传到azure blob中的任何新文件与已经上传的文件同名,那么它会自动覆盖以前上传的文件的内容。 null 因此,如果我上传一个名为“file1.docx”的新文件,它们有不同的内容。那么blob存储将替换以前上传的file1.docx。所以在这种情况下,我丢失了以前上传的文件。 blob存储有什么方法可以自动检测到有重复,这样

  • 我有一个html应用程序,我需要加密它,但由于im总是添加信息,我不能。我需要做一个按钮,允许用户输入文本,并有脚本覆盖它永久到html脚本。这将允许他们以后访问它,或者它将继续重置。救命啊!!

  • 我有一个pdf模板,我试图在新文档中重写它。我需要从模板PDF中获取一些字段,并在新的PDF中重写它们的值。我这样做: 但我发现了一个例外: iText。内核PDFEException:“没有用于生成间接项的关联PdfWriter。” 我做错了什么以及如何修复它?这是第七次。

  • 正如标题所说,我有一个文件编写器,我想多次重复使用该程序并将文本保存到同一文本文档中的新行中。 代码: