9

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

由于我绑定到 Eclipse RCP/SWT,我正在使用org.eclipse.swt.widgets.FileDialog.
该文档FileDialog指出使用setFilterPath(String string)-method 应该完全满足我的需要(请参阅文档)。

   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此处描述的行为。

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

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

感谢您的任何帮助回答!

4

3 回答 3

1

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

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 搞砸。

于 2021-10-01T11:35:13.967 回答
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();

不知何故,调用方法的顺序是相关的。

于 2020-06-17T12:51:06.643 回答
-1

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

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

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

于 2013-08-16T15:31:58.183 回答