Unless you are starting with "draw a pixel", any API or toolkit or tool will help you get things done quickly as long as you are doing things 'their way', i.e. in ways the API designers have planned for. When you want to add something that doesn't 'fit' into their way of doing things, then your problems start. You end up fighting with the API, or doing things at very low levels, or doing too much work to design your "new" stuff to work within/the same as, the API.
The best solution is to go ahead and design your GUI, and when you discover, as you implement it, that some of the features of the GUI are nigh impossible to build within your API, just learn to be satisfied with the remaining 90% of the features done your way, and either cut the remaining feature or implement them in a way that works with the API, even it if is less than ideal.
event based vs 'normal' programs - and also worker threads and how it's not REALLY quite event based
Swing kinda seems to have the model built in but really it doesn't - you can kinda skate by with using the data 'in' the swing widgets (text field, buttons, what have you) as your model but really in the end it just makes things more complicated and you're better off having a totally separate model.
I.e. redraw everything every time we repaint/change, rather than 'backing store'. Also the entire notion of changing state and then calling repaint(). Also while we're at it, maybe talk about Graphics and Graphics2D and the notion of overriding paint()? This is necessary in some situations but not in others. For instance, say you're using a JButton. You specify an icon for the button, maybe change the icon when the button is pressed. All part of JButton, just use it and it works. But if you want to make a new KIND of button, say perhaps you want to do an animation of the icon when you hover the mouse over it, and switch to a different animation while the mouse key is being pressed, now you have to subclass JButton and override paint(). You also now have to use drawing stuff from Graphics/Graphics2D.
historically how and why it happened, and the difference between them, etc. (Generally think of AWT as the lower level "draw stuff here" vs Swing as the higher level "draw a widget/button/text field here".)
learn/know how paint()/repaint()/paintComponent() calls work, when they're called, in what order, which ones you SHOULD be overriding and when you should be overriding them.
Lack of understand this and the crappy programs that have resulted are the main reason the public in general thinks Java sucks and is slow.
swing repaint thread - invokeLater/invokeAndWait and worker threads, locking is usually bad; in general don't touch ANY Swing objects directly once you've made them visible, always use invokeLater/invokeAndWait to modify them and/or read from them.