When you hear comparisons between AWT and Swing components, one of the first points mentioned is that Swing is lightweight. What this essentially means is that there are no real native controls "behind" Swing buttons, internal frames, and menus. Everything is controlled in pure Java, including rendering and event handling. While this provides a much more flexible way to create truly platform-independent components, the task of creating a custom Swing component that has a consistent look across all platforms and look-and-feels is not an easy one. This article walks through the process of creating a new Swing component of medium complexity and highlights the important points, steps, and pitfalls along the way.