JTreeで表示したフォルダ構造でWindowsのlnkショートカット先に移動する
Total: 357, Today: 2, Yesterday: 4
Posted by aterai at
Last-modified:
Summary
JTreeを使用して作成したフォルダ構造のTreeNodeがWindowsのlnkショートカットの場合、JFileChooserのShellFolderを利用してリンク先フォルダに移動可能にします。
Screenshot

Advertisement
Source Code Examples
private File getRealFile8(File file) {
try {
ShellFolder sf = ShellFolder.getShellFolder(file);
if (sf.isLink()) {
file = sf.getLinkLocation();
}
} catch (FileNotFoundException ex) {
file = null;
}
return file;
}
// private File getRealFile9(File file) {
// if (fileSystemView.isLink(file)) {
// try {
// file = fileSystemView.getLinkLocation(file);
// } catch (FileNotFoundException ex) {
// file = null;
// }
// }
// return file;
// }
// private File getRealFile(File file) {
// String version = System.getProperty("java.specification.version");
// if (Double.parseDouble(version) >= 9.0) {
// file = getRealFile9(file);
// } else {
// file = getRealFile8(file);
// }
// return file;
// }
View in GitHub: Java, KotlinDescription
上記のサンプルでは、FileSystemViewを使ってディレクトリ構造をJTreeに表示するのようにJTreeを使用してディレクトリ構造を表示した場合でもJFileChooserと同様にWindows環境で作成されたlnkショートカットのリンク先を参照可能になるよう設定しています。
Java 8とそれ以前の場合:ShellFolder#isLink()でリンクファイルかどうかをチェック可能ShellFolder#getLinkLocation()で指定されたリンクファイルが参照する通常のファイル(ShellFolder)を取得可能WindowsLoodAndFeel環境のJFileChooserではShellFolderを実装したsun.awt.shell.Win32ShellFolder2でリンク先ファイルを取得している
Java 9以降の場合:- FileSystemView#isLink(File)でリンクファイルかどうかをチェック可能
- FileSystemView#getLinkLocation(File)で指定されたリンクファイルが参照する通常のファイルを取得可能
- [JDK-8081722] Provide public access to sun.awt.shell.ShellFolder methods which are required for implementing javax.swing.JFileChooser - Java Bug System
Java 9以降でShellFolder#getLinkLocation()を使用する場合は--add-exports=java.desktop/sun.awt.shell=ALL-UNNAMEDとしてパッケージsun.awt.shellをエクスポートする必要がある
Reference
- FileSystemViewを使ってディレクトリ構造をJTreeに表示する
- [JDK-8081722] Provide public access to sun.awt.shell.ShellFolder methods which are required for implementing javax.swing.JFileChooser - Java Bug System
- FileSystemView#isLink(File) (Java SE 9 & JDK 9)
- FileSystemView#getLinkLocation(File) (Java SE 9 & JDK 9)
- Links, Symbolic or Otherwise (The Java™ Tutorials > Essential Java Classes > Basic I/O)
- Files#readSymbolicLink(Path) (Java Platform SE 8)
- シンボリックリンクなどは
Java 8でもFiles#readSymbolicLink(Path)などが使用可能だが、.lnkによるショートカットリンクは対応しない - Windows shortcut (.lnk) parser in Java? - Stack Overflowに
ShellFolderを使用せず.lnkを解析してリンク先を探すサンプルなどがある
- [JDK-4356160] JFileChooser doesn't support shortcuts (.lnk files) - Java Bug System
JFileChooserで.lnkによるショートカットリンクが移動可能になったのはJava 5から
- Windows 7でJava/SwingのJFileChooserがシンボリックリンクをたどれない - torutkのブログ