JTreeで表示したフォルダ構造でWindowsのlnkショートカット先に移動する
Total: 18
, Today: 1
, Yesterday: 17
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, KotlinExplanation
上記のサンプルでは、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のブログ