aboutsummaryrefslogtreecommitdiff
path: root/src/share/classes/javax/swing
diff options
context:
space:
mode:
authorrupashka <none@none>2008-05-01 14:47:50 +0400
committerrupashka <none@none>2008-05-01 14:47:50 +0400
commitce9f36acbcdc5b775035874c13401be6cf15ffac (patch)
treecc37cc5950ba08146a47416794a2baab51110b7b /src/share/classes/javax/swing
parent29a8404a0016940ca32ba34151afeb5d6e0efa86 (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.java45
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) ||