1 package org.apidesign.gc;
4 import java.beans.PropertyChangeEvent;
5 import java.beans.PropertyChangeListener;
6 import java.lang.ref.WeakReference;
7 import javax.swing.JPanel;
8 import junit.framework.AssertionFailedError;
9 import org.junit.After;
10 import org.junit.AfterClass;
11 import org.junit.Before;
12 import org.junit.BeforeClass;
13 import org.junit.Test;
14 import org.netbeans.junit.NbTestCase;
15 import static org.junit.Assert.*;
17 public class WeakListenersTest {
19 private static JPanel longLivingBean;
21 public WeakListenersTest() {
25 public static void setUpClass() throws Exception {
26 longLivingBean = new JPanel();
31 longLivingBean.setBackground(Color.BLACK);
35 public void listenWithoutWeakReference() {
36 PropL listener = new PropL();
37 longLivingBean.addPropertyChangeListener(listener);
38 longLivingBean.setBackground(Color.WHITE);
39 assertEquals("background property change notified", "background", listener.propName);
40 WeakReference<Object> ref = new WeakReference<Object>(listener);
44 "Of course, this listener cannot disappear, because it is held from long living JavaBean",
47 } catch (AssertionFailedError ex) {
49 // of course it cannot be garbage collected. That is OK.
52 fail("The listener cannot be GCed as it is held from long living JavaBean");
56 public void listenViaWeakListener() {
57 PropL listener = new PropL();
59 PropertyChangeListener weakL = WeakListeners.create(PropertyChangeListener.class, listener, longLivingBean);
60 longLivingBean.addPropertyChangeListener(weakL);
61 longLivingBean.setBackground(Color.WHITE);
62 assertEquals("background property change notified", "background", listener.propName);
64 WeakReference<Object> ref = new WeakReference<Object>(listener);
66 NbTestCase.assertGC("This listener can disappear", ref);
71 private static class PropL implements PropertyChangeListener {
73 public void propertyChange(PropertyChangeEvent evt) {
74 propName = evt.getPropertyName();