1. How should I be logging the source of exceptions??
Use one existing logging framework and feed it with caught exceptions.
2. Can you explain what you mean by "deriving Swing components is rather unusual"?
By inheriting you tightly couple your whole game stuff to concrete Swing components.
Then, you extend its responsibility with domain (game) specific stuff.
And force engine users to use your components.
Look up inheritance vs. composition.
- Unless I'm mistaken, the only place I use synchronization is in the input classes, which I've made singletons. Once the objects are made, the program won't encounter the synchronization call again. But, I agree. If you did see that call elsewhere, could you let me know?
When synchronized methods access members, all others methods doing that as well, must be synchronized too, otherwise that has no effect.
3. I don't get what you mean by "no creation of concrete ui components and screens in the game engine".
Again, that is highly usage dependent. Choice of UI classes, look, layout and their compositions should be left to the engine user.
4. The point of createGameCanvas, is for the user to be able to use the canvas they've created. The code that is done outside of that method is code that should run regardless of what kind of canvas they've used. I can't quite think of a more efficient way to do that part.
Just let the user completely create the canvas. Splitting the creation code causes confusion and is inflexible.
7. I tried to explain in the comments the best that I could. The EGameStarter is basically just a start button for EGame. Since EGameStarter is not used outside of the constructor, I found that it was more efficient to have EGame create it and display it. The reason it's passed into EGame is in the event the user wants to create a custom start up dialog, rather than use the default that I've built. And EGameStarter needs the current instance of EGame to be able to call it's run method to start the game.
Don't start the game from the constructor. A constructor creates an object but should not start the game. Doing so, the dependency to EGameStarter would be obsolete.