A few abstract notes about game engines and going with the times:
###Choice of UI-Framework
Choice of UI-Framework
You have chosen Swing as your UI Framework. This is a decision I frankly cannot understand. Swing has been officially deprecated in favor of JavaFX. Not only that, Swing is slow.
It's not getting easier by virtue that I know of no way to load textures in Swing. Also there's no proper integration for OpenGL (let alone any other render engine) into Swing.
These problems could easily be remedied by instead working with JavaFX, which is the new official UI framework and has acceptable, if not good integration for OpenGL through javafx.scene.canvas.Canvas
###Raw AWT
Raw AWT
Working on raw AWT to integrate free drawing with java.awt.Canvas
is a royal pain and actually just a workaround for the lack of proper support in Swing. You shouldn't have to work against your UI Framework. Instead work with it and use it to your advantage. Leverage it.
###Design mistakes and OOP violations
Design mistakes and OOP violations
Making your GMEngine
an abstract class is probably a good move. Making the stuff I need for drawing inaccessible from subclasses probably isn't.
Note that most graphics engines are expected to work on a different basis than your "Engine". This comes back to favouring Composition over Inheritance. The point I'm trying to make is that an Engine should help a programmer get work done in significantly less steps than it needed before.
It should boil down to loading Textures, positioning them and then calling something like render()
repeatedly after updating the texture positions. This is simply speaking impossible with your current design, because I as "user" of your Engine have to write the code to do that myself anyways. It would've been easier for me to just write those 200-ish lines here myself, because then I have the full control over what I render and only insignificantly more work.
I think you should revisit your motivations for this class and get a clearer idea for what it should actually do to make life easier for you (and other programmers).