diff --git a/src/dorkbox/util/swing/ActiveRenderLoop.java b/src/dorkbox/util/swing/ActiveRenderLoop.java index afca4ea..e14d265 100644 --- a/src/dorkbox/util/swing/ActiveRenderLoop.java +++ b/src/dorkbox/util/swing/ActiveRenderLoop.java @@ -65,26 +65,28 @@ class ActiveRenderLoop implements Runnable { actionHandlerLong.handle(updateDeltaNanos); } - for (int i = 0; i < SwingActiveRender.activeRenders.size(); i++) { - JFrame jFrame = SwingActiveRender.activeRenders.get(i); + // this needs to be synchronized because we don't want to our frame removed WHILE we are rendering it. + synchronized (SwingActiveRender.activeRenders) { + for (int i = 0; i < SwingActiveRender.activeRenders.size(); i++) { + JFrame jFrame = SwingActiveRender.activeRenders.get(i); - final BufferStrategy buffer = jFrame.getBufferStrategy(); + final BufferStrategy buffer = jFrame.getBufferStrategy(); - // maybe the frame was closed - if (buffer != null) { - try { - graphics = buffer.getDrawGraphics(); - jFrame.paint(graphics); - } catch (IllegalStateException ignored) { - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (graphics != null) { - graphics.dispose(); + // maybe the frame was closed + if (buffer != null) { + try { + graphics = buffer.getDrawGraphics(); + jFrame.paint(graphics); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (graphics != null) { + graphics.dispose(); - // blit the back buffer to the screen - if (!buffer.contentsLost()) { - buffer.show(); + // blit the back buffer to the screen + if (!buffer.contentsLost()) { + buffer.show(); + } } } } diff --git a/src/dorkbox/util/swing/SwingActiveRender.java b/src/dorkbox/util/swing/SwingActiveRender.java index 9e0bf2c..a485410 100644 --- a/src/dorkbox/util/swing/SwingActiveRender.java +++ b/src/dorkbox/util/swing/SwingActiveRender.java @@ -18,6 +18,7 @@ package dorkbox.util.swing; import java.awt.Component; import java.awt.EventQueue; import java.util.ArrayDeque; +import java.util.ArrayList; import java.util.Collections; import java.util.Deque; import java.util.List; @@ -41,7 +42,7 @@ public final class SwingActiveRender { private static Thread activeRenderThread = null; - static final List activeRenders = new CopyOnWriteArrayList(); + static final List activeRenders = new ArrayList(); static final List activeRenderEvents = new CopyOnWriteArrayList(); // volatile, so that access triggers thread synchrony, since 1.6. See the Java Language Spec, Chapter 17