I have enhanced this code slightly to make it even cooler:
You should compare the new version to the old. Note that in Thing.java, in the constructor I load an image object, and in paint(), instead of drawing a boring circle, it draws the image.In Ex3.java, we now only initialize 2 Things. It also adds StartActionListener as a "keyListener" to the JFrame.
In StartActionListener.java, the class now implements KeyListener as well as ActionListener. See how the method keyReleased() adds a new Thing to the ArrayList. Note how I could have also dont this in keyPressed() or keyTyped(). See when running the program that hitting most keys generates keyPressed() and keyReleased() events, but some keys (like the arrow keys) do not generate keyTyped events. Finally, notice how when the start buton is pressed, KeyboardFocusManager.getCurrentKeyboardFocusManager().upFocusCycle(); is called to make sure the JFrame, not the button has the focus of the key events.
Now you know enough to write a real game.
Show off to your instructor by beating your partner handily.