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 org.junit.After;
9 import org.junit.AfterClass;
10 import org.junit.Before;
11 import org.junit.BeforeClass;
12 import org.junit.Test;
13 import org.netbeans.junit.NbTestCase;
14 import static org.junit.Assert.*;
16 public class WeakListenersTest {
18 private static JPanel longLivingBean;
20 public WeakListenersTest() {
24 public static void setUpClass() throws Exception {
25 longLivingBean = new JPanel();
30 longLivingBean.setBackground(Color.BLACK);
34 public void listenWithoutWeakReference() {
35 PropL listener = new PropL();
36 longLivingBean.addPropertyChangeListener(listener);
37 longLivingBean.setBackground(Color.WHITE);
38 assertEquals("background property change notified", "background", listener.propName);
39 WeakReference<Object> ref = new WeakReference<Object>(listener);
43 "Of course, this listener cannot disappear, because it is held from long living JavaBean",
46 } catch (Exception ex) {
48 // of course it cannot
51 fail("The listener cannot be GCed as it is held from long living JavaBean");
55 public void listenViaWeakListener() {
56 PropL listener = new PropL();
58 PropertyChangeListener weakL = WeakListeners.create(PropertyChangeListener.class, listener, longLivingBean);
59 longLivingBean.addPropertyChangeListener(weakL);
60 longLivingBean.setBackground(Color.WHITE);
61 assertEquals("background property change notified", "background", listener.propName);
63 WeakReference<Object> ref = new WeakReference<Object>(listener);
65 NbTestCase.assertGC("This listener can disappear", ref);
70 private static class PropL implements PropertyChangeListener {
72 public void propertyChange(PropertyChangeEvent evt) {
73 propName = evt.getPropertyName();