Swing 是否支持 Windows 7 样式的文件选择器?

2022-08-31 22:34:26

我刚刚在我正在编写的一个小桌面应用程序中添加了一个标准的“打开文件”对话框,该对话框基于Swing教程的JFileChooser条目。它正在生成一个如下所示的窗口:

screenshot of unwanted/XP-style window

但我更喜欢有一个看起来像这样的窗口:

screenshot of desired/7-style window

换句话说,我希望我的文件选择器具有Windows Vista / Windows 7的样式,而不是Windows XP的样式。这在Swing中可能吗?如果是这样,是如何完成的?(出于此问题的目的,假定代码将仅在 Windows 7 计算机上运行。


答案 1

Java 6 中的 Swing 似乎不支持此功能。

目前,我能找到的打开此对话框的最简单方法是通过SWT,而不是Swing。SWT 的 FileDialog (javadoc) 会显示此对话框。以下是对 SWT 的文件对话框代码段的修改,以使用打开对话框而不是保存对话框。我知道这并不是您要查找的内容,但是您可以将其隔离到实用程序类中,并将swt.jar添加到该功能的类路径中。

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;

public class SWTFileOpenSnippet {
    public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell (display);
        // Don't show the shell.
        //shell.open ();  
        FileDialog dialog = new FileDialog (shell, SWT.OPEN | SWT.MULTI);
        String [] filterNames = new String [] {"All Files (*)"};
        String [] filterExtensions = new String [] {"*"};
        String filterPath = "c:\\";
        dialog.setFilterNames (filterNames);
        dialog.setFilterExtensions (filterExtensions);
        dialog.setFilterPath (filterPath);
        dialog.open();
        System.out.println ("Selected files: ");
        String[] selectedFileNames = dialog.getFileNames();
        for(String fileName : selectedFileNames) {
            System.out.println("  " + fileName);
        }
        shell.close();
        while (!shell.isDisposed ()) {
            if (!display.readAndDispatch ()) display.sleep ();
        }
        display.dispose ();
    }
} 

答案 2

即使是本机Windows应用程序也可以在Windows 7上显示这种类型的对话框。这通常由 OPENFILENAME 结构中的标志控制,其大小在对 WinAPI 函数 GetOpenFileName 的调用中传递。Swing(Java)使用钩子从“打开文件”对话框获取事件;这些事件在 Windows XP 和 Windows 7 版本之间以不同的方式传递。

所以答案是你无法控制Swing的FileChooser的外观。但是,当Java获得对这种新外观的支持时,您将自动获得新样式。

另一种选择是使用 SWT,如本答案中所建议的那样。或者,您可以使用JNA调用Windows API或编写本机方法来执行此操作。


推荐