Author: [EMAIL PROTECTED]
Date: Sun Nov  9 02:49:39 2008
New Revision: 410

Added:
     
piccolo2d.java/trunk/extras/src/test/java/edu/umd/cs/piccolox/pswing/PSwingTest.java
Modified:
     
piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwing.java

Log:
Fix for issue 8: PSwing nodes prevent proper garbage collection
Added a test case that adds a PSwing node, removes it, and checks for  
remaining references.  Prior to this fix the memory was not reclaimed even  
after removal.


Modified:  
piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwing.java
==============================================================================
---  
piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwing.java
         
(original)
+++  
piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/pswing/PSwing.java
         
Sun Nov  9 02:49:39 2008
@@ -219,10 +219,12 @@
      /*The parent listener for camera/canvas changes*/
      private PropertyChangeListener parentListener = new  
PropertyChangeListener() {
          public void propertyChange( PropertyChangeEvent evt ) {
-            PNode source = (PNode)evt.getSource();
-            PNode parent = source.getParent();
+            PNode parent = (PNode) evt.getNewValue();
+            clearListeners((PNode) evt.getOldValue());
              if( parent != null ) {
                  listenForCanvas( parent );
+            } else {
+                updateCanvas( null );
              }

          }
@@ -513,7 +515,12 @@

              PNode parent = p;
  //            System.out.println( "parent = " + parent.getClass() );
-            if( parent instanceof PLayer ) {
+            if( parent instanceof PCamera) {
+                PCamera cam = (PCamera) parent;
+                if( cam.getComponent() instanceof PSwingCanvas ) {
+                    updateCanvas( (PSwingCanvas)cam.getComponent() );
+                }
+            } else if( parent instanceof PLayer ) {
                  PLayer player = (PLayer)parent;
  //                System.out.println( "Found player: with " +  
player.getCameraCount() + " cameras" );
                  for( int i = 0; i < player.getCameraCount(); i++ ) {
@@ -556,6 +563,22 @@
      }

      /**
+     * Clear out all the listeners registered to make sure there are no  
stray references
+     *
+     * @param fromParent Parent to start with for clearing listeners
+     */
+    private void clearListeners(PNode fromParent) {
+        if (fromParent == null) {
+            return;
+        }
+        if (listeningTo(fromParent)) {
+            fromParent.removePropertyChangeListener(  
PNode.PROPERTY_PARENT, parentListener );
+            listeningTo.remove(fromParent);
+            clearListeners(fromParent.getParent());
+        }
+    }
+
+    /**
       * Removes this PSwing from previous PSwingCanvas (if any), and ensure  
that this PSwing is attached to the new PSwingCanvas.
       * @param newCanvas the new PSwingCanvas (may be null)
       */
@@ -564,8 +587,8 @@
              if( canvas != null ) {
                  canvas.removePSwing( this );
              }
+            canvas = newCanvas;
              if( newCanvas != null ) {
-                canvas = newCanvas;
                  canvas.addPSwing( this );
                  reshape();
                  repaint();

Added:  
piccolo2d.java/trunk/extras/src/test/java/edu/umd/cs/piccolox/pswing/PSwingTest.java
==============================================================================
--- (empty file)
+++  
piccolo2d.java/trunk/extras/src/test/java/edu/umd/cs/piccolox/pswing/PSwingTest.java
     
Sun Nov  9 02:49:39 2008
@@ -0,0 +1,37 @@
+package edu.umd.cs.piccolox.pswing;
+
+import junit.framework.TestCase;
+
+import javax.swing.*;
+
+import edu.umd.cs.piccolo.PNode;
+import edu.umd.cs.piccolox.PFrame;
+
+import java.lang.ref.WeakReference;
+import java.lang.ref.ReferenceQueue;
+
+/**
+ * JUnit test class to exercise PSwing bugfixes.
+ *
+ * @author Stephen Chin
+ */
+public class PSwingTest extends TestCase {
+    public void testPSwing() {
+        PSwing pSwing = new PSwing(new JButton("test"));
+        PFrame frame = new PFrame();
+        frame.getCanvas().getLayer().addChild(pSwing);
+        frame.setVisible(true);
+    }
+
+    public void testReferences() {
+        WeakReference pSwing = new WeakReference(new PSwing(new  
JButton("test")), new ReferenceQueue());
+        PFrame frame = new PFrame();
+        frame.getCanvas().getLayer().addChild((PNode) pSwing.get());
+        frame.setVisible(true);
+        frame.getCanvas().getLayer().removeAllChildren();
+        for (int i=0; i<20; i++) { // make sure garbage collection has  
happened
+            System.gc();
+        }
+        assertTrue("The PSwing node should be garbage collected after  
removal", pSwing.isEnqueued());
+    }
+}

--~--~---------~--~----~------------~-------~--~----~
Piccolo2D Developers Group: http://groups.google.com/group/piccolo2d-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to