Cleaned up sync issues with Swing Active Rendering

This commit is contained in:
nathan 2017-02-16 00:00:55 +01:00
parent d041655c6d
commit 897c4a83cb
2 changed files with 21 additions and 18 deletions

View File

@ -65,6 +65,8 @@ class ActiveRenderLoop implements Runnable {
actionHandlerLong.handle(updateDeltaNanos);
}
// 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);
@ -75,7 +77,6 @@ class ActiveRenderLoop implements Runnable {
try {
graphics = buffer.getDrawGraphics();
jFrame.paint(graphics);
} catch (IllegalStateException ignored) {
} catch (Exception e) {
e.printStackTrace();
} finally {
@ -90,6 +91,7 @@ class ActiveRenderLoop implements Runnable {
}
}
}
}
// Sync the display on some systems (on Linux, this fixes event queue problems)
Toolkit.getDefaultToolkit()

View File

@ -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<JFrame> activeRenders = new CopyOnWriteArrayList<JFrame>();
static final List<JFrame> activeRenders = new ArrayList<JFrame>();
static final List<ActionHandlerLong> activeRenderEvents = new CopyOnWriteArrayList<ActionHandlerLong>();
// volatile, so that access triggers thread synchrony, since 1.6. See the Java Language Spec, Chapter 17