如何获取SWT DirectoryDialog记住的上次选中文件夹?
获取DirectoryDialog记住的上次选中文件夹
嘿,这个问题确实戳中了SWT对话框的一个小细节——原生对话框的历史记录是由操作系统管理的,SWT本身并没有提供直接的API来读取这个“记住的路径”。不过我们有两种可行的思路来解决这个问题:
一、手动记录路径(最可靠、跨平台)
既然SWT没给我们直接获取的方法,那我们可以自己接管这个记录工作,每次用户选择完文件夹后主动保存路径,下次打开对话框时不仅能预设路径,还能轻松拿到上次的选择。
实现示例:用Java Preferences存储
Java的java.util.prefs.Preferences是个轻量级的存储方案,适合保存这类小配置:
import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Shell; import java.util.prefs.Preferences; public class DirectoryDialogHelper { private static final String LAST_SELECTED_DIR_KEY = "last_selected_directory"; private static Preferences prefs = Preferences.userNodeForPackage(DirectoryDialogHelper.class); public static String openDirectoryDialog(Shell shell) { DirectoryDialog dialog = new DirectoryDialog(shell); // 读取上次保存的路径,设置为对话框的初始路径 String lastDir = prefs.get(LAST_SELECTED_DIR_KEY, null); if (lastDir != null) { dialog.setFilterPath(lastDir); } String selectedDir = dialog.open(); // 如果用户选择了文件夹,保存到Preferences if (selectedDir != null) { prefs.put(LAST_SELECTED_DIR_KEY, selectedDir); } return selectedDir; } // 单独获取上次选中的路径 public static String getLastSelectedDirectory() { return prefs.get(LAST_SELECTED_DIR_KEY, null); } }
这样不管操作系统怎么处理原生对话框的历史,我们都能稳定拿到自己记录的上次路径,而且跨Windows、Mac、Linux都能用。
二、读取操作系统的原生存储(不推荐,兼容性差)
如果一定要获取操作系统原生对话框记住的路径,那得针对不同系统做适配,但这种方法很脆弱,因为系统版本更新可能会改变存储位置或格式:
- Windows:路径保存在注册表
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSavePidlMRU\Directory,需要用Java的注册表访问API读取,但非标准库依赖且注册表结构复杂,还可能有权限问题。 - MacOS:相关信息存在
~/Library/Preferences/com.apple.finder.plist或其他系统plist文件中,需要解析plist格式,依赖系统版本且需要额外处理。 - Linux:不同桌面环境存储位置不同,比如GNOME用dconf的
org.gtk.Settings.FileChooser键,需要通过gsettings命令读取,依赖桌面环境,通用性差。
所以这种方法只适合特定场景,大部分情况下还是手动记录更靠谱。
内容的提问来源于stack exchange,提问作者Dinko Ivanov
相关产品推荐
相关产品推荐

