You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2021/11/11 18:12:15 UTC

svn commit: r1894955 - /pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java

Author: tilman
Date: Thu Nov 11 18:12:15 2021
New Revision: 1894955

URL: http://svn.apache.org/viewvc?rev=1894955&view=rev
Log:
PDFBOX-5320: reduce HighResolutionImageIcons memory leaks

Modified:
    pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java

Modified: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java?rev=1894955&r1=1894954&r2=1894955&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java Thu Nov 11 18:12:15 2021
@@ -1053,6 +1053,33 @@ public class PDFDebugger extends JFrame
     private void replaceRightComponent(Component pane)
     {
         int div = jSplitPane.getDividerLocation();
+        
+        // Avoid memory leak with the display image
+        // if anyone knows a better way to do this, please tell
+        Component rightComponent = jSplitPane.getRightComponent();
+        if (rightComponent instanceof JScrollPane)
+        {
+            JScrollPane scrollPane = (JScrollPane) rightComponent;
+            Component view = scrollPane.getViewport().getView();
+            if (view instanceof JPanel)
+            {
+                JPanel panel = (JPanel) view;
+                for (Component component : panel.getComponents())
+                {
+                    if (component instanceof JLabel)
+                    {
+                        ((JLabel) component).setIcon(null);
+                    }
+                }
+                panel.removeAll();
+                scrollPane.getViewport().setView(null);
+                scrollPane.getViewport().removeAll();
+                scrollPane.setViewport(null);
+                scrollPane.removeAll();
+                // still leaks but it's really the image that bothers; listeners still active
+            }
+        }
+
         jSplitPane.setRightComponent(pane);
         jSplitPane.setDividerLocation(div);
     }