The JFC Swing Tutorial: A Guide to Constructing GUIs (2nd Edition)
< Day Day Up > |
How to Use Internal Frames
With the JInternalFrame [73] class, you can display a JFrame -like window within another window. Usually, you add internal frames to a desktop pane, which in turn might be used as the content pane of a JFrame . The desktop pane is an instance of JDesktopPane , [74] which is a subclass of JLayeredPane [75] that has added API for managing multiple overlapping internal frames. [73] InternalFrame API documentation: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JInternalFrame.html. [74] JDesktopPane API documentation is on the CD and online at: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JDesktopPane.html. [75] Layered panes are discussed in How to Use Layered Panes (page 258). Consider carefully whether to base your program's GUI around frames or internal frames. Switching from internal frames to frames or vice versa isn't necessarily a simple task. By experimenting, you can get an idea of the tradeoffs involved in choosing one over the other. Figure 25 shows an application that has two internal frames (one of which is iconified ) inside a regular frame. Figure 25. The InternalFrameDemo application.
Try This:
The following code, taken from InternalFrameDemo.java , creates the desktop and internal frames in the previous example. ... //In the constructor of InternalFrameDemo, a JFrame subclass: desktop = new JDesktopPane(); createFrame(); //Create first window setContentPane(desktop); ... //Make dragging faster: //desktop.putClientProperty("JDesktopPane.dragMode", //pre-1.3 code "outline"); desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); //1.3+ code ... protected void createFrame() { MyInternalFrame frame = new MyInternalFrame(); frame.setVisible(true); //necessary as of 1.3 desktop.add(frame); try { frame.setSelected(true); } catch (java.beans.PropertyVetoException e) {} } ...//In the constructor of MyInternalFrame, a JInternalFrame subclass: static int openFrameCount = 0; static final int xOffset = 30, yOffset = 30; public MyInternalFrame() { super("Document #" + (++openFrameCount), true, //resizable true, //closable true, //maximizable true);//iconifiable //...Create the GUI and put it in the window... //...Then set the window size or call pack... ... //Set the window's location. setLocation(xOffset*openFrameCount, yOffset*openFrameCount); } Internal Frames versus Regular Frames
The code for using internal frames is similar in many ways to that for using regular Swing frames. Because internal frames have root panes, setting up the GUI for a JInternalFrame is very similar to setting up the GUI for a JFrame . JInternalFrame also provides other API, such as pack , that makes it similar to JFrame .
Note: Just as for a regular frame, you must invoke setVisible(true) or show() on an internal frame to display it. In early versions of the Java 2 platform (such as 1.2.2), this code has no effect because the internal frame is visible by default. However, starting in the v1.3 release, the internal frame doesn't appear until you explicitly make it visible.
That internal frames aren't windows or top-level containers makes them different from frames. For example, you must add an internal frame to a container (usually a JDesktopPane ); an internal frame can't be the root of a containment hierarchy. Also, internal frames don't generate window events. Instead, the user actions that cause a frame to fire window events cause an internal frame to fire internal frame events. Because internal frames are implemented with platform-independent code, they add functionality that frames can't give you. For example, internal frames give you more control over their state and capabilities than frames do. You can programatically iconify or maximize an internal frame. You can also specify what icon goes in the internal frame's title bar. You can even specify whether the internal frame has the window decorations to support resizing, iconifying, closing, and maximizing. Another feature is that internal frames are designed to work within desktop panes. The JInternalFrame API contains methods , such as moveToFront , that work only if the internal frame's container is a layered pane such as a JDesktopPane . Rules of Using Internal Frames
If you've built any programs using JFrame and the other Swing components, you already know a lot about how to use them. The following list summarizes the rules for using internal frames. For additional information, see How to Make Frames (Main Windows) (page 236) earlier in this chapter and The JComponent Class (page 53) in Chapter 3. You must set the size of the internal frame.
If you don't, it will have zero size and thus never be visible. You can set the size using setSize , pack , or setBounds . As a rule, you should set the location of the internal frame.
If you don't, it will come up at 0,0 (the upper left of its container). You can use set-Location or setBounds to specify the upper left point of the internal frame, relative to its container. To add components to an internal frame, add them to its content pane.
This is exactly like the JFrame situation. See Adding Components to the Content Pane (page 48) in Chapter 3 for details. Dialogs that are internal frames should be implemented using JOptionPane or JInternalFrame , not JDialog .
To create a simple dialog, you can use the JOptionPane showInternal Xxx Dialog methods, as described in How to Make Dialogs (page 187). You must add an internal frame to a container.
If you don't add the internal frame to a container (usually a JDesktopPane ), the internal frame won't appear. You need to call show or setVisible on internal frames.
Beginning with the v1.3 release, internal frames are invisible by default. You must invoke setVisible(true) or show() to make them visible. Internal frames fire internal frame events, not window events.
Handling internal frame events is almost identical to handling window events. See How to Write an Internal Frame Listener (page 670) in Chapter 10 for more information.
Performance Tip: Because dragging internal frames can be slow, Swing 1.1.1 and the Java 2 platform, v1.2.2, added a way to make it zippy: outline dragging. With outline dragging, only the outline of the internal frame is painted at the current mouse position while the window is being dragged. The internal frame's innards are not repainted at a new position until the dragging stops. The default, slow behavior is to reposition and repaint the entire internal frame continuously while it's being moved. In releases before v1.3, you can specify outline dragging by setting a client property of the desktop pane, like this: desktop.putClientProperty("JDesktopPane.dragMode", "outline"); The code has no effect in JFC implementations before Swing 1.1.1 Beta 1. As of version 1.3, use the new JDesktopPane method setDragMode to specify outline dragging. For example: desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
The Internal Frame API
Tables 32 through 37 list the commonly used JInternalFrame constructors and methods, as well as a few methods that JDesktopPane provides. Besides the API listed in this section, JInternalFrame inherits useful API from its superclasses: JComponent , Component , and Container . See The JComponent Class (page 53) in Chapter 3 for lists of methods from those classes. Like JInternalFrame , JDesktopPane descends from JComponent and thus provides the methods described in The JComponent Class (page 53) in Chapter 3. Because JDesktopPane extends JLayeredPane , it also supports the methods described in The Layered Pane API (page 264) later in this chapter. Also consult the API documentation for JInternalFrame and JDesktopPane at: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JInternalFrame.html http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JDesktopPane.html Table 32. Creating the Internal Frame
Table 33. Adding Components to the Internal Frame
Table 34. Specifying the Internal Frame's Visibility, Size, and Location
Table 35. Performing Window Operations on the Internal Frame
Table 36. Controlling Window Decorations and Capabilities
Table 37. Using the JDesktopPane API
Examples That Use Internal Frames
The following examples use internal frames. Because internal frames are similar to regular frames, you should also look at Examples That Use Frames (page 244) earlier in this chapter.
|
< Day Day Up > |