【问题标题】:Java ask for overwrite jfilechooserJava 要求覆盖 jfilechooser
【发布时间】:2012-11-13 10:46:18
【问题描述】:

我有一个函数应该获取在jfilechooser 的文本输入中键入的文件的路径并将其传递给String。问题是如果文件已经存在,我想检查覆盖。我确实知道如何执行此操作,但我的问题是,如果对 JOptionPane 回答 noJFileChooser 无论如何都会关闭,因为保存按钮已经被操作.现在,我需要的是,如果答案是,程序会返回JFileChooser,仍然提示输入名称。

请注意,我正在寻找一个有效的解决方案,我已经考虑过再次执行该函数,但是由于我的程序很大,因此这种解决问题的方法既费时又效率不高。

这是我的函数的代码,由于我不知道如何处理它,所以还没有完成。

`public String FileSavePath()throws NullPointerException
    {
        File f=null;
        String theFilepath=null;
        JFileChooser FileChooser = new JFileChooser();
        if(FileChooser.showSaveDialog(null)==JFileChooser.APPROVE_OPTION)
        {
            theFilepath=FileChooser.getSelectedFile().getAbsolutePath();
            f=FileChooser.getSelectedFile();
            //System.out.println(theFile);
            if(f.exists())
            {
                int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?",
                        "Existing file",JOptionPane.YES_NO_CANCEL_OPTION);
                if(result==JOptionPane.YES_OPTION)
                           {
                   return theFilepath;

                  }
          else // here is what I should do if the user answers 'no' or cancels/closes the JOptionPane
        }
        else return null;
        return theFilepath;

    }`

【问题讨论】:

  • 这是一个老问题,但它是我搜索结果中的第一个问题。可以在以下位置找到一个相当漂亮的解决方案:stackoverflow.com/a/3729157/589525

标签: java swing file jfilechooser overwrite


【解决方案1】:

您需要将查询放入循环中,直到用户可以为您提供可接受的响应...

public String FileSavePath() throws NullPointerException {

    boolean acceptable = false;
    String theFilepath = null;

    do {
        theFilepath = null
        File f = null;
        JFileChooser FileChooser = new JFileChooser();
        if (FileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
            theFilepath = FileChooser.getSelectedFile().getAbsolutePath();
            f = FileChooser.getSelectedFile();
            //System.out.println(theFile);
            if (f.exists()) {
                int result = JOptionPane.showConfirmDialog(this, "The file exists, overwrite?",
                        "Existing file", JOptionPane.YES_NO_CANCEL_OPTION);
                if (result == JOptionPane.YES_OPTION) {
                    acceptable = true;
                }
            } else {
                acceptable = true;
            }
        } else {
            acceptable = true;
        }
    } while (!acceptable);

    return theFilepath;

}

【讨论】:

  • 是的,但这也将通过 FileChooser.showSaveDialog 的线程再次运行。我的想法是以某种方式阻止 FileChooser 关闭,除非文件没有覆盖任何内容或用户批准覆盖。您的想法与再次运行整个函数非常相似,但是如果 (!acceptable) 为真,则以迭代方式而不是递归 FileSavePath() 完成。谢谢你的回答,但我正在寻找更高效的东西,我非常渴望效率:)
  • 据我所知,JFileChooser 不提供任何方法来拦截“批准”事件。您知道用户做出选择的唯一方法是选择器返回时(并且选择器开始使用的模式对话框关闭)
  • 现在,我想我会保持原样,但我仍然需要一种方法来提高效率,我的应用程序需要这个很多,到目前为止它太慢了(使用许多其他进程打开,jfilechooser 最多需要 30 秒才能打开)进程较少但 eclipse 仍然打开,无论如何最多需要 7-10 秒,所以我会有一个恼火的用户。还注意到我第二次打开 jfilechooser 需要的时间更少(许多进程最多 5 秒,更少的最多 1.5 秒)。我正在考虑尝试在 showConfirmDialog 进程中某处发生的线程
  • 在处理jfilechooser之前的某个地方
  • 记住,Swing 不是线程安全的。您只能在 Event Dispatching Thread 的上下文中与 UI 组件进行交互。在您的情况下,我将创建一个工厂或实用程序类,该类将延迟加载 JFileChooser 并在应用程序(或其他事件)期间保持对它的活动引用,这将使调用该方法的速度更快未来
猜你喜欢
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2017-11-03
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多