From 8c25d139c9f176cd4a083092fccc329a31e9c0b9 Mon Sep 17 00:00:00 2001 From: Matthias Arzt <arzt@mpi-cbg.de> Date: Fri, 4 Sep 2020 16:44:41 +0200 Subject: [PATCH] Fix AWT memory leak issue --- src/main/java/bdv/tools/HelpDialog.java | 6 +-- .../bdv/tools/RecordMaxProjectionDialog.java | 5 +- .../java/bdv/tools/RecordMovieDialog.java | 5 +- .../tools/VisibilityAndGroupingDialog.java | 7 ++- .../tools/brightness/BrightnessDialog.java | 4 +- src/main/java/bdv/util/MemoryFixedDialog.java | 49 +++++++++++++++++++ 6 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 src/main/java/bdv/util/MemoryFixedDialog.java diff --git a/src/main/java/bdv/tools/HelpDialog.java b/src/main/java/bdv/tools/HelpDialog.java index e056c40b..4ccd0fcb 100644 --- a/src/main/java/bdv/tools/HelpDialog.java +++ b/src/main/java/bdv/tools/HelpDialog.java @@ -28,6 +28,8 @@ */ package bdv.tools; +import bdv.util.MemoryFixedDialog; + import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Frame; @@ -42,14 +44,13 @@ import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.InputMap; import javax.swing.JComponent; -import javax.swing.JDialog; import javax.swing.JEditorPane; import javax.swing.JScrollPane; import javax.swing.KeyStroke; import javax.swing.ScrollPaneConstants; import javax.swing.WindowConstants; -public class HelpDialog extends JDialog +public class HelpDialog extends MemoryFixedDialog { private static final long serialVersionUID = 1L; @@ -100,7 +101,6 @@ public class HelpDialog extends JDialog am.put( hideKey, hideAction ); pack(); - setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE ); } catch ( final IOException e ) { diff --git a/src/main/java/bdv/tools/RecordMaxProjectionDialog.java b/src/main/java/bdv/tools/RecordMaxProjectionDialog.java index d2b07663..dcc42668 100644 --- a/src/main/java/bdv/tools/RecordMaxProjectionDialog.java +++ b/src/main/java/bdv/tools/RecordMaxProjectionDialog.java @@ -30,6 +30,7 @@ package bdv.tools; import bdv.cache.CacheControl; import bdv.export.ProgressWriter; +import bdv.util.MemoryFixedDialog; import bdv.util.Prefs; import bdv.viewer.BasicViewerState; import bdv.viewer.ViewerPanel; @@ -56,7 +57,6 @@ import javax.swing.BoxLayout; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; -import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; @@ -77,7 +77,7 @@ import bdv.viewer.OverlayRenderer; import bdv.viewer.render.RenderTarget; import net.imglib2.util.LinAlgHelpers; -public class RecordMaxProjectionDialog extends JDialog implements OverlayRenderer +public class RecordMaxProjectionDialog extends MemoryFixedDialog implements OverlayRenderer { private static final long serialVersionUID = 1L; @@ -275,7 +275,6 @@ public class RecordMaxProjectionDialog extends JDialog implements OverlayRendere am.put( hideKey, hideAction ); pack(); - setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE ); } /** diff --git a/src/main/java/bdv/tools/RecordMovieDialog.java b/src/main/java/bdv/tools/RecordMovieDialog.java index 9ae851aa..ae5c564f 100644 --- a/src/main/java/bdv/tools/RecordMovieDialog.java +++ b/src/main/java/bdv/tools/RecordMovieDialog.java @@ -30,6 +30,7 @@ package bdv.tools; import bdv.cache.CacheControl; import bdv.export.ProgressWriter; +import bdv.util.MemoryFixedDialog; import bdv.util.Prefs; import bdv.viewer.BasicViewerState; import bdv.viewer.ViewerPanel; @@ -55,7 +56,6 @@ import javax.swing.BoxLayout; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; -import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; @@ -70,7 +70,7 @@ import net.imglib2.realtransform.AffineTransform3D; import bdv.viewer.OverlayRenderer; import bdv.viewer.render.RenderTarget; -public class RecordMovieDialog extends JDialog implements OverlayRenderer +public class RecordMovieDialog extends MemoryFixedDialog implements OverlayRenderer { private static final long serialVersionUID = 1L; @@ -248,7 +248,6 @@ public class RecordMovieDialog extends JDialog implements OverlayRenderer am.put( hideKey, hideAction ); pack(); - setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE ); } public void recordMovie( final int width, final int height, final int minTimepointIndex, final int maxTimepointIndex, final File dir ) throws IOException diff --git a/src/main/java/bdv/tools/VisibilityAndGroupingDialog.java b/src/main/java/bdv/tools/VisibilityAndGroupingDialog.java index b4a42dca..9b5b2bac 100644 --- a/src/main/java/bdv/tools/VisibilityAndGroupingDialog.java +++ b/src/main/java/bdv/tools/VisibilityAndGroupingDialog.java @@ -28,6 +28,7 @@ */ package bdv.tools; +import bdv.util.MemoryFixedDialog; import bdv.viewer.SourceAndConverter; import bdv.viewer.ViewerState; import bdv.viewer.VisibilityAndGrouping; @@ -61,7 +62,6 @@ import javax.swing.ButtonGroup; import javax.swing.InputMap; import javax.swing.JCheckBox; import javax.swing.JComponent; -import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; @@ -73,7 +73,7 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @Deprecated -public class VisibilityAndGroupingDialog extends JDialog +public class VisibilityAndGroupingDialog extends MemoryFixedDialog { private static final long serialVersionUID = 1L; @@ -117,7 +117,7 @@ public class VisibilityAndGroupingDialog extends JDialog content.add( visibilityPanel ); content.add( groupingPanel ); content.add( modePanel ); - getContentPane().add( content, BorderLayout.NORTH ); + add( content, BorderLayout.NORTH ); final ActionMap am = getRootPane().getActionMap(); final InputMap im = getRootPane().getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ); @@ -147,7 +147,6 @@ public class VisibilityAndGroupingDialog extends JDialog } ); pack(); - setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE ); } public void update() diff --git a/src/main/java/bdv/tools/brightness/BrightnessDialog.java b/src/main/java/bdv/tools/brightness/BrightnessDialog.java index 1e71f960..aabaeea4 100644 --- a/src/main/java/bdv/tools/brightness/BrightnessDialog.java +++ b/src/main/java/bdv/tools/brightness/BrightnessDialog.java @@ -65,6 +65,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import bdv.util.InvokeOnEDT; +import bdv.util.MemoryFixedDialog; import mpicbg.spim.data.generic.sequence.BasicViewSetup; import net.imglib2.type.numeric.ARGBType; @@ -75,7 +76,7 @@ import net.imglib2.type.numeric.ARGBType; * @author Tobias Pietzsch <tobias.pietzsch@gmail.com> */ @Deprecated -public class BrightnessDialog extends JDialog +public class BrightnessDialog extends MemoryFixedDialog { public BrightnessDialog( final Frame owner, final SetupAssignments setupAssignments ) { @@ -148,7 +149,6 @@ public class BrightnessDialog extends JDialog } ); pack(); - setDefaultCloseOperation( WindowConstants.HIDE_ON_CLOSE ); } public static class ColorsPanel extends JPanel diff --git a/src/main/java/bdv/util/MemoryFixedDialog.java b/src/main/java/bdv/util/MemoryFixedDialog.java new file mode 100644 index 00000000..9f60c07b --- /dev/null +++ b/src/main/java/bdv/util/MemoryFixedDialog.java @@ -0,0 +1,49 @@ +package bdv.util; + +import javax.swing.*; +import java.awt.*; + +public class MemoryFixedDialog extends JDialog +{ + private boolean packIsPending = false; + + public MemoryFixedDialog() + { + super(); + super.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE ); + } + + public MemoryFixedDialog( Frame owner, String title, boolean modal ) + { + super( owner, title, modal ); + } + + @Override + public void pack() + { + if ( isVisible() ) + { + packIsPending = false; + super.pack(); + } + else + packIsPending = true; + } + + @Override + public void setVisible( boolean visible ) + { + if ( visible && packIsPending ) + { + packIsPending = false; + super.pack(); + } + super.setVisible( visible ); + } + + @Override + public void setDefaultCloseOperation( int operation ) + { + // do nothing + } +} -- GitLab