Both Swing and AWT are old Form frameworks for the Java language. Swing is
better to work with and allows you to use "looks and feels" (skins). AWT is
"heavy-weight" and harder to work with. However, you should use JavaFX, which is
the most modern approach to create form applications in Java.
Where possible, AWT uses native components. As in, under Windows it will use
Window’s buttons, etc. This is really good for accessibility, because other
programs like screen readers and such can interoperate perfectly with these
components already. It does mean that extending the functionality of these
components, changing the way they look, etc, is next to impossible. Many classes
are final, and cannot be subclassed. Because they use the operating system’s
native components, they are often limited to the subset of capabilities which
are common to all target windowing operating systems. The look and feel is also
inconsistent between different operating systems.
Java Swing, on the other hand, uses virtual components, which you can
subclass to your heart’s content, and can change their behavior and look. They
look and behave identical across all operating systems, and are far more
full-featured than the AWT components.
For creating things like rich textfields with emoticons, Swing is the way to
go.
The main difference between AWT and Swing in Java is that AWT is Java's
original platform dependent windowing, graphics and user interface widget
toolkit while Swing is a GUI widget toolkit for Java that is an extension of
AWT.