Closed gmaczuga closed 1 year ago
Okay so I didn't debug your code or anything, but just from the stack trace, it seems that you are accessing triangle details from different concurrent threads. This can easily happen when you do calculations on the main thread, then modify a Triangles (or Lines or Points) object accordingly from this thread. The rendering takes place on the AWT event despatch thread, and when rendering and modifications take place at the same time it can cause a concurrent modification exception.
In this case you can for example use SwingUtilities.invokeLater(...)
or SwingUtilities.invokeAndWait(...)
for the part that modifies the Renderable object (Triangles), which will push this action onto the event dispatch queue and will then be called on the dispatch thread (and therefore not concurrently with rendering).
Another issue could be that you are not running the rest of your AWT/Swing application on the event dispatch thread (which you should). I would recommend to call things like frame.setVisible(true)
with invokeLater.
It could also be a one time problem when setting up the Renderable objects on the main thread but already displaying the window somewhere in between. In this case you can simply call the window showing code in the end, after everything is set up.
For further debugging you can use SwingUtilities.isEventDispatchThread()
to check which parts are and which are not running on the dispatch thread.
Is this helping a bit?
That helped! Thx
Experiencing the java.util.ConcurrentModificationException:
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1631) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at hageldave.jplotter.renderables.Triangles.getIntersectingTriangles(Triangles.java:453) at hageldave.jplotter.renderers.TrianglesRenderer.renderFallback(TrianglesRenderer.java:263) at hageldave.jplotter.renderers.CoordSysRenderer.renderFallback(CoordSysRenderer.java:715) at hageldave.jplotter.canvas.BlankCanvasFallback.render(BlankCanvasFallback.java:115) at hageldave.jplotter.canvas.BlankCanvasFallback.render(BlankCanvasFallback.java:106) at hageldave.jplotter.canvas.BlankCanvasFallback.repaint(BlankCanvasFallback.java:70) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
and quite dirty source code of JPanel (that draws 60 OHLC of price candles).