kawa attempts to access sun.java2d.SunGraphics2D, which is no longer permitted in Java >= 11 or so

I wrote a simple Kawa graphics library for my kids to learn scheme. It works great in Java 1.8.0 on the Mac. upgrading to Java 20, it no longer works, bombing with

Exception in thread "AWT-EventQueue-0" java.lang.IllegalAccessException: class gnu.expr.PrimProcedure cannot access class sun.java2d.SunGraphics2D (in module java.desktop) because module java.desktop does not export sun.java2d to unnamed module @73669809

My Kawa code is pretty bog-standard. I'm making a new kind of JPanel which, on paintComponent, grabs the Graphics, puts in in a global variable, calls my kids's functions in (draw), and then finishes up.

(define-simple-class PalettePanel (javax.swing.JPanel)
        ((paintComponent (graphics ::java.awt.Graphics))
                (let ((bounds ((this):getBounds)))
                        (set! palette-width bounds:width)
                        (set! palette-height bounds:height))
                (set! palette-graphics graphics)
                (draw)
                (reset-key)))

In (draw) my kids set the color on the grpahics object using a (color ...) function, for example:

(define (color color) (palette-graphics:setColor color))
(define black java.awt.Color:BLACK)

(color black)

It's here that graphics appears to then try to access sun.java2d.SunGraphics2D, which is no longer permitted.

Full backtrace is below:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalAccessException: class gnu.expr.PrimProcedure cannot access class sun.java2d.SunGraphics2D (in module java.desktop) because module java.desktop does not export sun.java2d to unnamed module @73669809
	at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:394)
	at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:709)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at gnu.expr.PrimProcedure.applyToConsumerX(PrimProcedure.java:310)
	at gnu.expr.PrimProcedure.applyToConsumer(PrimProcedure.java:189)
	at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
	at gnu.mapping.CallContext.runUntilValue(CallContext.java:669)
	at gnu.mapping.Procedure.applyN(Procedure.java:142)
	at gnu.kawa.functions.NamedPart.applyN(NamedPart.java:90)
	at gnu.mapping.ProcedureN.applyToObject(ProcedureN.java:45)
	at gnu.mapping.CallContext.runUntilValue(CallContext.java:656)
	at gnu.mapping.Procedure.apply1(Procedure.java:154)
	at gnu.kawa.functions.ApplyToArgs.apply2(ApplyToArgs.java:52)
	at atInteractiveLevel-37.color(game.scm:66)
	at atInteractiveLevel-37.color$check(game.scm:66)
	at gnu.mapping.CallContext.runUntilValue(CallContext.java:656)
	at gnu.mapping.Procedure.apply1(Procedure.java:154)
	at atInteractiveLevel-60.draw(GiacomoStick.scm:40)
	at atInteractiveLevel-60.draw$check(GiacomoStick.scm:34)
	at gnu.mapping.CallContext.runUntilValue(CallContext.java:656)
	at gnu.mapping.Procedure.apply0(Procedure.java:148)
	at PalettePanel.paintComponent(game.scm:84)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1128)
	at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5318)
	at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1656)
	at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1631)
	at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1569)
	at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1336)
	at java.desktop/javax.swing.JComponent._paintImmediately(JComponent.java:5266)
	at java.desktop/javax.swing.JComponent.paintImmediately(JComponent.java:5076)
	at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:878)
	at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:861)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:861)
	at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:834)
	at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:784)
	at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1897)
	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:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	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)
Edited by Sean Luke