Part III - Advanced Topics
Subpages: 1. JLayeredPane
2. Using JLayeredPane to enhance interfaces
3. Creating a custom MDI: part I - Dragging panels
4. Creating a custom MDI: part II - Resizability
5. Creating a custom MDI: part III - Enhancements
6. Creating a custom MDI: part IV - Selection and management
7. Creating a custom MDI: part V - JavaBeans compliance
In chapters 15 through 21 we discuss the most advanced Swing components and the classes and interfaces that support them. We start with JLayeredPane in chapter 15, and implement our own MDI internal frame component from scratch. Chapter 16 is about JDesktopPane and JIntenalFrame, the MDI components that ship with Swing. This chapter culminates with the implementation of a multi-user networked desktop environment. Chapters 17 and 18 discuss the powerful and intricate tree and table components. Among other examples, we show how to build a directory browser using the tree component, and a sortable, JDBC-aware stocks application using the table component. Chapter 19 continues with text component coverage where chapter 11 left off, and discusses them at a much lower level. Chapter 20 is the most advanced chapter in this book and presents a complete RTF word processor application using JTextPane and several powerful custom dialogs used to manage fonts, paragraph formatting, find and replace, and spell checking. Chapter 21 discusses the pluggable look-and-feel architecture in detail and presents the contstruction of our own custom LookAndFeel implementation. This chapter includes examples showing how to implement custom component support for existing and third party L&Fs, and custom L&F support for both existing and custom components.
Chapter 15. Layered Panes and custom MDI
In this chapter:
- Using JLayeredPane to enhance interfaces
- Creating a custom MDI: part I - Dragging panels
- Creating a custom MDI: part II - Resizability
- Creating a custom MDI: part III - Enhancements
- Creating a custom MDI: part IV - Selection and management
- Creating a custom MDI: part V - JavaBeans compliance
JLayeredPane is one of the most powerful and robust components in the Swing package. It is a container with a practically infinite number of layers in which components can reside. Not only is there no limit to the number or type of components in each layer, but components can overlap one another.
Components within each layer of a JLayeredPane are organized by position. When overlapping is necessary those components with a higher valued position are displayed under those with a lower valued position. However, components in higher layers are displayed over all components residing in lower layers. It is important to get this overlapping hierarchy down early, as it can often be confusing.
Position is numbered from -1 to the number of components in the layer minus one. If we have N components in a layer then the component at position 0 will overlap the component at position 1, and the component at position 1 will overlap the component at position 2, etc. The lowest position is N-1. Note that position -1 represents the same position as N-1. Figure 15.1 illustrates position within a layer.
Figure 15.1 Position of components within a layer.
The layer a component resides at is often referred to as its depth. (Note that heavyweight components cannot conform to this notion of depth--see chapter 1 for more about this.) Each layer is represented by an Integer object (whereas the position of a component within each layer is represented by an int value). The JLayeredPane class defines six different Integer object constants representing, what are intended to be, commonly used layers: FRAME_CONTENT_LAYER, DEFAULT_LAYER, PALETTE_LAYER, MODAL_LAYER, POPUP_LAYER, and DRAG_LAYER.
Figure 15.2 illustrates the six standard layers and their overlap hierarchy.
Figure 15.2. The JLayeredPane standard layers
We have discussed a component's layer and position within a layer. There is also another value associated with each component within a JLayeredPane. This value is called the index. The index is the same as position if we were to ignore layers. That is, components are assigned indices by starting from position 0 in the highest layer and counting upward in position and downward in layer until all layers have been exhausted. The lowest component in the lowest layer will have index M-1, where M is the total number of components in the JLayeredPane. Similar to position, an index of -1 means the bottom-most component. (Note that the index is really a combination a component's layer and position. As such there are no methods to directly change a component's index within JLayeredPane. Although we can always query a component for its current index.)
There are three ways to add a component to a JLayeredPane. (Note that there is no add method defined within JLayeredPane itself.) Each method used to add a component to a JLayeredPane is defined within the Container class (see API docs).
1. We can add a component to a JLayeredPane using the add(Component component) method. This places the component in the layer represented by the Integer object with value 0, the DEFAULT_LAYER.
2. To add a component to a specific layer of a JLayeredPane we use the add(Component component, Object obj) method. We pass this method our component and an Integer object representing the desired layer. For layer 10 we would pass it: new Integer(10). If we wanted to place it on one of the standard layers, for instance the POPUP_LAYER, we could instead pass it JLayeredPane.POPUP_LAYER.
3. To add a component to a specific position within a specific layer we would use the add(Component component, Object obj, int index) method. Where the object is specified as above, and the int is the value representing the component's position with the layer.