【问题标题】:Set the initial directory in SWT FileDialog在 SWT FileDialog 中设置初始目录
【发布时间】:2013-08-06 04:25:40
【问题描述】:

我正在处理一个 Eclipse RCP 项目,需要让用户选择一些文件。 为方便起见,根据某些情况,文件选择对话框的初始目录应在打开前设置。

由于我绑定到 Eclipse RCP / SWT,我正在使用 org.eclipse.swt.widgets.FileDialog
这个FileDialog 的文档指出使用setFilterPath(String string)-方法,它应该完全符合我的需要(参见documentation)。

   FileDialog dialog = new FileDialog(shell, SWT.OPEN);
   dialog.setFilterExtensions(new String [] {"*.html"});
   dialog.setFilterPath("c:\\temp");
   String result = dialog.open();

不幸的是,它不起作用,至少不是“每次”。

我目前没有安装来检查它,但我很确定该功能在 Windows 200/XP/Vista 机器上完全可以正常工作。 我正在使用 Windows 7 机器,我认为我正在遭受这里为 lpstrInitialDir 描述的行为。

至少,这正是我面临的行为:第一次打开对话框时路径很好,但第二次时,路径最初设置为最后选择的路径。 这在大多数情况下似乎很方便,但在我的情况下却不是。

这是对的吗? 如果是这样,我是否有机会根据自己的需要改变行为?

感谢您的帮助!

【问题讨论】:

标签: java swt rcp filedialog


【解决方案1】:

我为您描述的问题找到了一个简单的解决方案(我遇到了完全相同的问题)。

只需像这样重新排列您的代码:

   FileDialog dialog = new FileDialog(shell, SWT.OPEN);
   dialog.setFilterPath("c:\\temp"); // This line is switched with the following line
   dialog.setFilterExtensions(new String [] {"*.html"});
   String result = dialog.open();

调用方法的顺序是相关的。

【讨论】:

  • 对不起,对我不起作用。它总是打开到上次显示的相同路径。奇怪的是,“内存”在应用程序重新启动后仍然存在。我觉得 SWT 的文件对话框会将这些信息存储在注册表中有点牵强。
【解决方案2】:

我在 Windows 10 上遇到了同样的问题,并找到了一个似乎对我有用的解决方案。 DirectoryDialog 中的代码 sn-p 导致了正确的方向:

if (filterPath != null && filterPath.length() > 0) {
        String path = filterPath.replace('/', '\\');
        char[] buffer = new char[path.length() + 1];
        path.getChars(0, path.length(), buffer, 0);
        if (COM.SHCreateItemFromParsingName(buffer, 0, COM.IID_IShellItem, ppv) == OS.S_OK) {
            IShellItem psi = new IShellItem(ppv[0]);
            /*
             * SetDefaultDirectory does not work if the dialog has
             * persisted recently used folder. The fix is to clear the
             * persisted data.
             */
            fileDialog.ClearClientData();
            fileDialog.SetDefaultFolder(psi);
            psi.Release();
        }
}

FileDialog 缺少此语句“fileDialog.ClearClientData()”。我的解决方案是在设置路径之前执行以下代码并打开对话框:

long [] ppv = new long [1];
if (COM.CoCreateInstance(COM.CLSID_FileOpenDialog, 0, COM.CLSCTX_INPROC_SERVER, COM.IID_IFileOpenDialog, ppv) == OS.S_OK) {
    IFileDialog fileDialog = new IFileDialog(ppv[0]);
    fileDialog.ClearClientData();
    fileDialog.Release();
}

现在您可以设置过滤器路径,而不会让 Windows 搞砸。

【讨论】:

    【解决方案3】:

    当您重新打开它时,您是否使用相同的 FileDialog 对象?

    我进行了一些快速测试,发现如果您重新设置 filterPath,对话框会在正确的位置打开。

    如果我再次打开同一个对象,它会从之前选择的位置开始。

    【讨论】:

    • 我遇到了同样的问题,即 setFilterPath() 并不总是有效。我可以推断出的最接近的是 setFilterPath() 是一致的,当提供一个文件夹时,例如“C:\\”,但是如果您指定一个网络主机,例如“\\\\jmr-stamp01”,那么所有赌注已关闭。有时您会看到网络路径,有时则不会。我怀疑 SWT FileDialog 类中存在错误。
    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多