Why does it JFileChooser take long time if some of the mounted (net use) network drives (on MS windows platform) are temporarily disconnected ?
Created May 4, 2012
Problem Definition :
The JFileChooser tries to connect to all the drives from 'C:' to 'Z:' when
instantiated to look for the root directory of each drive. This is done so that
the JComboBox of drives can be populated. If any of the drives was a network drive
and for some reason disconnected the check for the root directory
has to timeout before it returns the disconnected status. In that case the
the drive is not included in the JComboBox of JFileChooser. This may take a few
seconds for each drive. Thus it takes a while for JFileChooser to come up.
The user may think that the application has crashed.
Some drives may indeed be found connected. Then the JFileChooser comes up.
However between that time and when the user selects a drive it might have been
disconnected. In that case user gets the error dialog anyways. Thus the failure mode
in case of first having checked for network drive vs not is the same. The
complete set of drives on MS windows platform is not unknowable
(considering UNC names are not supported by the JFileChooser anyways).
This has other disadvantage. If a drive that is not in the JComboBox gets
connected after the creation of JFileChooser the user may not be able
access it (if the application kept on reusing the JFileChooser instance
and did not allow the mechanism to refresh it).
So why not populate the all the drive letters in the JComboBox in the first
place. In absense of which, at least a refresh JComboBox button should
be provided on the JFileChooser.
Solution:
Install a custom subclass of -
using the any of the following ctors -
In the javax.swing.filechooser.WindowsFileSystemView subclass override the -
javax.swing.filechooser.WindowsFileSystemView
JFileChooser
public JFileChooser(FileSystemView fsv)
Creates a JFileChooser using the given FileSystemView
JFileChooser
public JFileChooser(File currentDirectory,
FileSystemView fsv)
Creates a JFileChooser using the given current directory and FileSystemView
JFileChooser
public JFileChooser(String currentDirectoryPath,
FileSystemView fsv)
Creates a JFileChooser using the given current directory path and FileSystemView
public File[] getRoots();
to return all drive letters from 'A:' to 'Z:'