RFR: 8139228: JFileChooser renders file names as HTML document
Sergey Bylokhov
serb at openjdk.org
Tue May 13 03:04:52 UTC 2025
On Thu, 8 May 2025 04:08:30 GMT, Tejesh R <tr at openjdk.org> wrote:
>> @aivanov-jdk @TejeshR13
>> This seems stalled because there are conflicting statements
>> - Alexei : you can create a custom FIleSystemView on windows with <html> in path names.
>> - Tejesh : no you can't, or at least it doesn't work when you try to use it.
>>
>> Can we please get that reconciled ?
>> Tejesh pls show the code you used, and Alexei please show how you would do it.
>
> I tried with this code snippet.
>
> import javax.swing.JFileChooser;
> import javax.swing.SwingUtilities;
> import javax.swing.UIManager;
> import javax.swing.UnsupportedLookAndFeelException;
> import javax.swing.filechooser.FileSystemView;
> import java.io.File;
> import java.util.Arrays;
>
> public class VirtualFileChooser {
>
> public static void main(String[] args) throws UnsupportedLookAndFeelException, ClassNotFoundException, InstantiationException, IllegalAccessException {
> UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
> //UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
>
>
> SwingUtilities.invokeLater(() -> {
> JFileChooser chooser = new JFileChooser(new VirtualFileSystemView());
>
> int result = chooser.showOpenDialog(null);
> if (result == JFileChooser.APPROVE_OPTION) {
> File selectedFile = chooser.getSelectedFile();
> System.out.println("Selected: " + selectedFile.getAbsolutePath());
> }
> });
> }
>
> static class VirtualFileSystemView extends FileSystemView {
>
> private final File[] roots;
>
> public VirtualFileSystemView() {
> // Create a dummy root folder
> String name = "<html><h1 color=#ff00ff><font face="Comic Sans MS">SWING ROCKS!!!111";
> roots = new File[]{new File(name)};
> }
>
> @Override
> public File createNewFolder(File containingDir) {
>
> File folder = new File(containingDir, "New Folder");
> folder.mkdir();
> return folder;
> }
>
> @Override
> public File[] getRoots() {
> return roots;
> }
>
> @Override
> public File getHomeDirectory() {
> return roots[0];
> }
>
> @Override
> public File getDefaultDirectory() {
> return roots[0];
> }
>
> @Override
> public File[] getFiles(File dir, boolean useFileHiding) {
> // Simulate a virtual folder structure
> return new File[]{
> new File(dir, "virtualFile1.txt"),
> new File(dir, "virtualFile2.txt"),
> new File(dir, "virtualFolder")
> };
> }
>
> @Override
> public boolean isRoot(File file) {
> return Arrays.asList(roots).contains(file);
> }
>
> @Override
> public Boolean isTraversable(File f) {
> return true;
> }
> ...
> Exception in thread "AWT-EventQueue-0" java.nio.file.InvalidPathException: Illegal char <<> at index 0: <html><h1 color=#ff00ff><font face="Comic Sans MS">SWING ROCKS!!!111
> at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:191)
> at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:142)
> at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:46)
> at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
> at java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:203)
> at java.base/java.nio.file.Path.of(Path.java:148)
> at java.base/java.nio.file.Paths.get(Paths.java:69)
> at java.desktop/sun.awt.shell.ShellFolder.getShellFolder(ShellFolder.java:260)
> at java.desktop/javax.swing.filechooser.FileSystemView.getShellFolder(FileSystemView.java:724)
> at java.desktop/javax.swing.filechooser.FileSystemView.getSystemIcon(FileSystemView.java:242)
> at java.desktop/com.sun.java.swing.plaf.windows.WindowsFileChooserUI$WindowsFileView.getIcon(WindowsFileChooserUI.java:1398)
> at java.desktop/javax.swing.JFileChooser.getIcon(JFileChooser.java:1614)
This exception looks like a bug? I think if the file was not found then null is an expected result.
For now it can be bypassed by this:
import java.io.File;
import java.lang.Override;
import javax.swing.Icon;
import javax.swing.JFileChooser;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.filechooser.FileSystemView;
public class VirtualFileChooser {
public static void main(String[] args) throws UnsupportedLookAndFeelException, ClassNotFoundException, InstantiationException, IllegalAccessException {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
SwingUtilities.invokeLater(() -> {
JFileChooser chooser = new JFileChooser(new VirtualFileSystemView());
int result = chooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = chooser.getSelectedFile();
System.out.println("Selected: " + selectedFile.getAbsolutePath());
}
});
}
static class VirtualFileSystemView extends FileSystemView {
@Override
public File createNewFolder(File containingDir) {
return null;
}
@Override
public File[] getRoots() {
return new File[]{
new File("/", "<html><h1 color=#ff00ff><font face="Comic Sans MS">SWING ROCKS!!!111"),
new File("/", "virtualFile2.txt"),
new File("/", "virtualFolder")
};
}
@Override
public File getHomeDirectory() {
return new File("/");
}
@Override
public File getDefaultDirectory() {
return new File("/");
}
@Override
public File[] getFiles(File dir, boolean useFileHiding) {
// Simulate a virtual folder structure
return new File[]{
new File("/", "<html><h1 color=#ff00ff><font face="Comic Sans MS">SWING ROCKS!!!111"),
new File(dir, "virtualFile2.txt"),
new File(dir, "virtualFolder")
};
}
@Override
public Icon getSystemIcon(File f) {
return null;
}
}
}
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/24439#discussion_r2085839647
More information about the client-libs-dev
mailing list