Java swing

When Java was first released, its user interface facilities were a significant weakness. The Abstract Window Toolkit
(AWT) was part of the JDK from the beginning, but it really wasn't sufficient to support a complex user interface. It supported everything you could do in an HTML form and provided free-standing frames, menus, and a few other
objects, but you'd be hard-pressed to implement an application as complex as Quicken or Lotus Notes. AWT also had its share of portability problems; it relied heavily on the runtime platform's native user interface components, and
it wasn't always possible to hide differences in the way these components behaved.
JDK 1.1 fixed a number of problems—most notably, it introduced a new event model that was much more efficient
and easier to use—but it didn't make any major additions to the basic components. We got a ScrollPane and a
PopupMenu, but that was about it. Furthermore, AWT still relied on the native components and therefore continued
to have portability problems.