8204963: javax.swing.border.TitledBorder has a memory leak

Reviewed-by: serb, kaddepalli
This commit is contained in:
Prasanta Sadhukhan 2018-08-09 11:01:59 +05:30
parent ff148ce175
commit a70162e775
2 changed files with 119 additions and 12 deletions

View file

@ -42,6 +42,8 @@ import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicHTML;
import jdk.internal.ref.CleanerFactory;
/**
* A class which implements an arbitrary border
* with the addition of a String title in a
@ -759,22 +761,19 @@ public class TitledBorder extends AbstractBorder
private void installPropertyChangeListeners() {
final WeakReference<TitledBorder> weakReference = new WeakReference<TitledBorder>(this);
final PropertyChangeListener listener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (weakReference.get() == null) {
UIManager.removePropertyChangeListener(this);
UIManager.getDefaults().removePropertyChangeListener(this);
} else {
String prop = evt.getPropertyName();
if ("lookAndFeel".equals(prop) || "LabelUI".equals(prop)) {
label.updateUI();
}
}
final PropertyChangeListener listener = evt -> {
TitledBorder tb = weakReference.get();
String prop = evt.getPropertyName();
if (tb != null && ("lookAndFeel".equals(prop) || "LabelUI".equals(prop))) {
tb.label.updateUI();
}
};
UIManager.addPropertyChangeListener(listener);
UIManager.getDefaults().addPropertyChangeListener(listener);
CleanerFactory.cleaner().register(this, () -> {
UIManager.removePropertyChangeListener(listener);
UIManager.getDefaults().removePropertyChangeListener(listener);
});
}
}