JFileChooser > "Look in" 奇怪的名字
JFileChooser > "Look in" weird names
我有一个 java 应用程序在 Win7 上使用 JFileChooser。奇怪的是,有时(经常)但并非总是如此 - 驱动器名称在 'Look in:' 组合框中看起来很奇怪:
有没有人知道是什么原因造成的,以及如何让它始终显示专有名称?
那些来自系统驱动器,如“我的电脑”、“网上邻居”等
我绕过它显示文件的方式是:
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileView(new FileView() {
@Override
public String getName(File f) {
String name = FileSystemView.getFileSystemView().getSystemDisplayName(f);
// If names is empty use the description
if(name.equals("")) {
name = FileSystemView.getFileSystemView().getSystemTypeDescription(f);
}
return name;
}
});
通过这种方式,它始终会提取文件系统显示的名称。
我想分享一小段代码来解释 JFileChooser 的不那么明显的行为。
在 Windows 上,如果您在 CMD 会话中或在 Windows 文件浏览器中浏览文件系统,则会有所不同。
例如,您导航到驱动器 c:\
.
的根目录
CMD
rem this will still stay in C:\ as there is no parent directory
cd ..
Windows 文件资源管理器
- the parent directory of 'C:\' is 'Computer'
- but 'Computer' is not a real directory and is accessed by an CLSID (Class Identifier
for COM class objects), the incomprehensible '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}'
使此行为更加清晰的代码。
import java.io.File;
import javax.swing.filechooser.FileSystemView;
public class JFileChooserParentDirectory {
public static void main(String[] args) {
// the root directory of drive C:
File file = new File("C:/");
// get a view of the file system
FileSystemView fileSystemView = FileSystemView.getFileSystemView();
// get the parent directory of our file
File parentDir = fileSystemView.getParentDirectory(file);
// get the Windows display name of this parent directory
String displayName = fileSystemView.getSystemDisplayName(parentDir);
// get the Windows type description of this parent directory
String typeDescription = fileSystemView.getSystemTypeDescription(parentDir);
// print out all the different values
String printFormat = "%-50s: %s%n";
System.out.printf(printFormat, "file.getAbsolutePath()", file.getAbsolutePath());
System.out.printf(printFormat, "parentDir.getName()", parentDir.getName());
// this absolute path is related to the directory from which you started the code
System.out.printf(printFormat, "parentDir.getAbsolutePath()", parentDir.getAbsolutePath());
System.out.printf(printFormat, "fileSystemView.getSystemDisplayName(parentDir)", displayName);
System.out.printf(printFormat, "fileSystemView.getSystemTypeDescription(parentDir)", typeDescription);
}
}
这样打印出来。
file.getAbsolutePath() : C:\
parentDir.getName() : ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
parentDir.getAbsolutePath() : D:\development\Whosebug\playground\::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
fileSystemView.getSystemDisplayName(parentDir) : Computer
fileSystemView.getSystemTypeDescription(parentDir): System Folder
要解决 JFileChooser
中的问题,请从@inquisitor 获取解决方案。
我有一个 java 应用程序在 Win7 上使用 JFileChooser。奇怪的是,有时(经常)但并非总是如此 - 驱动器名称在 'Look in:' 组合框中看起来很奇怪:
有没有人知道是什么原因造成的,以及如何让它始终显示专有名称?
那些来自系统驱动器,如“我的电脑”、“网上邻居”等
我绕过它显示文件的方式是:
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileView(new FileView() {
@Override
public String getName(File f) {
String name = FileSystemView.getFileSystemView().getSystemDisplayName(f);
// If names is empty use the description
if(name.equals("")) {
name = FileSystemView.getFileSystemView().getSystemTypeDescription(f);
}
return name;
}
});
通过这种方式,它始终会提取文件系统显示的名称。
我想分享一小段代码来解释 JFileChooser 的不那么明显的行为。
在 Windows 上,如果您在 CMD 会话中或在 Windows 文件浏览器中浏览文件系统,则会有所不同。
例如,您导航到驱动器 c:\
.
CMD
rem this will still stay in C:\ as there is no parent directory
cd ..
Windows 文件资源管理器
- the parent directory of 'C:\' is 'Computer'
- but 'Computer' is not a real directory and is accessed by an CLSID (Class Identifier
for COM class objects), the incomprehensible '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}'
使此行为更加清晰的代码。
import java.io.File;
import javax.swing.filechooser.FileSystemView;
public class JFileChooserParentDirectory {
public static void main(String[] args) {
// the root directory of drive C:
File file = new File("C:/");
// get a view of the file system
FileSystemView fileSystemView = FileSystemView.getFileSystemView();
// get the parent directory of our file
File parentDir = fileSystemView.getParentDirectory(file);
// get the Windows display name of this parent directory
String displayName = fileSystemView.getSystemDisplayName(parentDir);
// get the Windows type description of this parent directory
String typeDescription = fileSystemView.getSystemTypeDescription(parentDir);
// print out all the different values
String printFormat = "%-50s: %s%n";
System.out.printf(printFormat, "file.getAbsolutePath()", file.getAbsolutePath());
System.out.printf(printFormat, "parentDir.getName()", parentDir.getName());
// this absolute path is related to the directory from which you started the code
System.out.printf(printFormat, "parentDir.getAbsolutePath()", parentDir.getAbsolutePath());
System.out.printf(printFormat, "fileSystemView.getSystemDisplayName(parentDir)", displayName);
System.out.printf(printFormat, "fileSystemView.getSystemTypeDescription(parentDir)", typeDescription);
}
}
这样打印出来。
file.getAbsolutePath() : C:\
parentDir.getName() : ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
parentDir.getAbsolutePath() : D:\development\Whosebug\playground\::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
fileSystemView.getSystemDisplayName(parentDir) : Computer
fileSystemView.getSystemTypeDescription(parentDir): System Folder
要解决 JFileChooser
中的问题,请从@inquisitor 获取解决方案。