diff options
author | rupashka <none@none> | 2008-05-01 14:47:50 +0400 |
---|---|---|
committer | rupashka <none@none> | 2008-05-01 14:47:50 +0400 |
commit | ce9f36acbcdc5b775035874c13401be6cf15ffac (patch) | |
tree | cc37cc5950ba08146a47416794a2baab51110b7b /src/share/classes/javax/swing | |
parent | 29a8404a0016940ca32ba34151afeb5d6e0efa86 (diff) |
6688203: Memory leak and performance problems in the method getFileSystemView of FileSystemView
Summary: Removed from the "FileSystemView#getFileSystemView" method creation of a new listener and adding it to UIManager
Reviewed-by: peterz
Diffstat (limited to 'src/share/classes/javax/swing')
-rw-r--r-- | src/share/classes/javax/swing/filechooser/FileSystemView.java | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/src/share/classes/javax/swing/filechooser/FileSystemView.java b/src/share/classes/javax/swing/filechooser/FileSystemView.java index b51b05dc1..a3773ab09 100644 --- a/src/share/classes/javax/swing/filechooser/FileSystemView.java +++ b/src/share/classes/javax/swing/filechooser/FileSystemView.java @@ -26,26 +26,18 @@ package javax.swing.filechooser; -import javax.swing.event.*; import javax.swing.*; import java.awt.Image; import java.io.File; -import java.io.FileFilter; -import java.io.FilenameFilter; import java.io.FileNotFoundException; import java.io.IOException; import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import java.util.Vector; +import java.lang.ref.WeakReference; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; - -import java.lang.reflect.*; - import sun.awt.shell.*; /** @@ -74,18 +66,11 @@ public abstract class FileSystemView { static FileSystemView unixFileSystemView = null; //static FileSystemView macFileSystemView = null; static FileSystemView genericFileSystemView = null; - static boolean useSystemExtensionsHiding = false; - public static FileSystemView getFileSystemView() { - useSystemExtensionsHiding = UIManager.getDefaults().getBoolean("FileChooser.useSystemExtensionHiding"); - UIManager.addPropertyChangeListener(new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("lookAndFeel")) { - useSystemExtensionsHiding = UIManager.getDefaults().getBoolean("FileChooser.useSystemExtensionHiding"); - } - } - }); + private boolean useSystemExtensionHiding = + UIManager.getDefaults().getBoolean("FileChooser.useSystemExtensionHiding"); + public static FileSystemView getFileSystemView() { if(File.separatorChar == '\\') { if(windowsFileSystemView == null) { windowsFileSystemView = new WindowsFileSystemView(); @@ -113,6 +98,26 @@ public abstract class FileSystemView { return genericFileSystemView; } + public FileSystemView() { + final WeakReference<FileSystemView> weakReference = new WeakReference<FileSystemView>(this); + + UIManager.addPropertyChangeListener(new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + FileSystemView fileSystemView = weakReference.get(); + + if (fileSystemView == null) { + // FileSystemView was destroyed + UIManager.removePropertyChangeListener(this); + } else { + if (evt.getPropertyName().equals("lookAndFeel")) { + fileSystemView.useSystemExtensionHiding = + UIManager.getDefaults().getBoolean("FileChooser.useSystemExtensionHiding"); + } + } + } + }); + } + /** * Determines if the given file is a root in the navigatable tree(s). * Examples: Windows 98 has one root, the Desktop folder. DOS has one root @@ -170,7 +175,7 @@ public abstract class FileSystemView { if (f != null) { name = f.getName(); if (!name.equals("..") && !name.equals(".") && - (useSystemExtensionsHiding || + (useSystemExtensionHiding || !isFileSystem(f) || isFileSystemRoot(f)) && ((f instanceof ShellFolder) || |