FileDocCategorySizeDatePackage
JInternalFrame.javaAPI DocJava SE 6 API83653Tue Jun 10 00:26:38 BST 2008javax.swing

JInternalFrame

public class JInternalFrame extends JComponent implements WindowConstants, RootPaneContainer, Accessible
A lightweight object that provides many of the features of a native frame, including dragging, closing, becoming an icon, resizing, title display, and support for a menu bar. For task-oriented documentation and examples of using internal frames, see How to Use Internal Frames, a section in The Java Tutorial.

Generally, you add JInternalFrames to a JDesktopPane. The UI delegates the look-and-feel-specific actions to the DesktopManager object maintained by the JDesktopPane.

The JInternalFrame content pane is where you add child components. As a conveniance add and its variants, remove and setLayout have been overridden to forward to the contentPane as necessary. This means you can write:

internalFrame.add(child);
And the child will be added to the contentPane. The content pane is actually managed by an instance of JRootPane, which also manages a layout pane, glass pane, and optional menu bar for the internal frame. Please see the JRootPane documentation for a complete description of these components. Refer to {@link javax.swing.RootPaneContainer} for details on adding, removing and setting the LayoutManager of a JInternalFrame.

Warning: Swing is not thread safe. For more information see Swing's Threading Policy.

Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications running the same version of Swing. As of 1.4, support for long term storage of all JavaBeansTM has been added to the java.beans package. Please see {@link java.beans.XMLEncoder}.

see
InternalFrameEvent
see
JDesktopPane
see
DesktopManager
see
JInternalFrame.JDesktopIcon
see
JRootPane
see
javax.swing.RootPaneContainer
version
1.158 08/08/06
author
David Kloba
author
Rich Schiavi
beaninfo
attribute: isContainer true attribute: containerDelegate getContentPane description: A frame container which is contained within another window.

Fields Summary
private static final String
uiClassID
protected JRootPane
rootPane
The JRootPane instance that manages the content pane and optional menu bar for this internal frame, as well as the glass pane.
protected boolean
rootPaneCheckingEnabled
If true then calls to add and setLayout will be forwarded to the contentPane. This is initially false, but is set to true when the JInternalFrame is constructed.
protected boolean
closable
The frame can be closed.
protected boolean
isClosed
The frame has been closed.
protected boolean
maximizable
The frame can be expanded to the size of the desktop pane.
protected boolean
isMaximum
The frame has been expanded to its maximum size.
protected boolean
iconable
The frame can "iconified" (shrunk down and displayed as an icon-image).
protected boolean
isIcon
The frame has been iconified.
protected boolean
resizable
The frame's size can be changed.
protected boolean
isSelected
The frame is currently selected.
protected Icon
frameIcon
The icon shown in the top-left corner of this internal frame.
protected String
title
The title displayed in this internal frame's title bar.
protected JDesktopIcon
desktopIcon
The icon that is displayed when this internal frame is iconified.
private Cursor
lastCursor
private boolean
opened
private Rectangle
normalBounds
private int
defaultCloseOperation
private Component
lastFocusOwner
Contains the Component that focus is to go when restoreSubcomponentFocus is invoked, that is, restoreSubcomponentFocus sets this to the value returned from getMostRecentFocusOwner.
public static final String
CONTENT_PANE_PROPERTY
Bound property name.
public static final String
MENU_BAR_PROPERTY
Bound property name.
public static final String
TITLE_PROPERTY
Bound property name.
public static final String
LAYERED_PANE_PROPERTY
Bound property name.
public static final String
ROOT_PANE_PROPERTY
Bound property name.
public static final String
GLASS_PANE_PROPERTY
Bound property name.
public static final String
FRAME_ICON_PROPERTY
Bound property name.
public static final String
IS_SELECTED_PROPERTY
Constrained property name indicated that this frame has selected status.
public static final String
IS_CLOSED_PROPERTY
Constrained property name indicating that the internal frame is closed.
public static final String
IS_MAXIMUM_PROPERTY
Constrained property name indicating that the internal frame is maximized.
public static final String
IS_ICON_PROPERTY
Constrained property name indicating that the internal frame is iconified.
private static final Object
PROPERTY_CHANGE_LISTENER_KEY
boolean
isDragging
boolean
danger
Constructors Summary
public JInternalFrame()
Creates a non-resizable, non-closable, non-maximizable, non-iconifiable JInternalFrame with no title.

        this("", false, false, false, false);
    
public JInternalFrame(String title)
Creates a non-resizable, non-closable, non-maximizable, non-iconifiable JInternalFrame with the specified title. Note that passing in a null title results in unspecified behavior and possibly an exception.

param
title the non-null String to display in the title bar

        this(title, false, false, false, false);
    
public JInternalFrame(String title, boolean resizable)
Creates a non-closable, non-maximizable, non-iconifiable JInternalFrame with the specified title and resizability.

param
title the String to display in the title bar
param
resizable if true, the internal frame can be resized

        this(title, resizable, false, false, false);
    
public JInternalFrame(String title, boolean resizable, boolean closable)
Creates a non-maximizable, non-iconifiable JInternalFrame with the specified title, resizability, and closability.

param
title the String to display in the title bar
param
resizable if true, the internal frame can be resized
param
closable if true, the internal frame can be closed

        this(title, resizable, closable, false, false);
    
public JInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable)
Creates a non-iconifiable JInternalFrame with the specified title, resizability, closability, and maximizability.

param
title the String to display in the title bar
param
resizable if true, the internal frame can be resized
param
closable if true, the internal frame can be closed
param
maximizable if true, the internal frame can be maximized

        this(title, resizable, closable, maximizable, false);
    
public JInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable)
Creates a JInternalFrame with the specified title, resizability, closability, maximizability, and iconifiability. All JInternalFrame constructors use this one.

param
title the String to display in the title bar
param
resizable if true, the internal frame can be resized
param
closable if true, the internal frame can be closed
param
maximizable if true, the internal frame can be maximized
param
iconifiable if true, the internal frame can be iconified

        
        setRootPane(createRootPane());
        setLayout(new BorderLayout());
        this.title = title;
        this.resizable = resizable;
        this.closable = closable;
        this.maximizable = maximizable;
        isMaximum = false;
        this.iconable = iconifiable;                         
        isIcon = false;
	setVisible(false);
        setRootPaneCheckingEnabled(true);
        desktopIcon = new JDesktopIcon(this);
	updateUI();
        sun.awt.SunToolkit.checkAndSetPolicy(this, true);
        addPropertyChangeListenerIfNecessary();
    
Methods Summary
protected voidaddImpl(java.awt.Component comp, java.lang.Object constraints, int index)
Adds the specified child Component. This method is overridden to conditionally forward calls to the contentPane. By default, children are added to the contentPane instead of the frame, refer to {@link javax.swing.RootPaneContainer} for details.

param
comp the component to be enhanced
param
constraints the constraints to be respected
param
index the index
exception
IllegalArgumentException if index is invalid
exception
IllegalArgumentException if adding the container's parent to itself
exception
IllegalArgumentException if adding a window to a container
see
#setRootPaneCheckingEnabled
see
javax.swing.RootPaneContainer

        if(isRootPaneCheckingEnabled()) {
            getContentPane().add(comp, constraints, index);
        }
        else {
            super.addImpl(comp, constraints, index);
        }
    
public voidaddInternalFrameListener(javax.swing.event.InternalFrameListener l)
Adds the specified listener to receive internal frame events from this internal frame.

param
l the internal frame listener

  // remind: sync ??
      listenerList.add(InternalFrameListener.class, l);
      // remind: needed?
      enableEvents(0);   // turn on the newEventsOnly flag in Component.
    
private static voidaddPropertyChangeListenerIfNecessary()


        
        if (AppContext.getAppContext().get(PROPERTY_CHANGE_LISTENER_KEY) ==
            null) {
            PropertyChangeListener focusListener = 
                new FocusPropertyChangeListener();

            AppContext.getAppContext().put(PROPERTY_CHANGE_LISTENER_KEY, 
                focusListener);

            KeyboardFocusManager.getCurrentKeyboardFocusManager().
                addPropertyChangeListener(focusListener);
        }
    
voidcompWriteObjectNotify()

      // need to disable rootpane checking for InternalFrame: 4172083
      boolean old = isRootPaneCheckingEnabled();
      try {
	setRootPaneCheckingEnabled(false);
        super.compWriteObjectNotify();
      } 
      finally {
	setRootPaneCheckingEnabled(old);
      }
    
protected javax.swing.JRootPanecreateRootPane()
Called by the constructor to set up the JRootPane.

return
a new JRootPane
see
JRootPane

        return new JRootPane();
    
public voiddispose()
Makes this internal frame invisible, unselected, and closed. If the frame is not already closed, this method fires an INTERNAL_FRAME_CLOSED event. The results of invoking this method are similar to setClosed(true), but dispose always succeeds in closing the internal frame and does not fire an INTERNAL_FRAME_CLOSING event.

see
javax.swing.event.InternalFrameEvent#INTERNAL_FRAME_CLOSED
see
#setVisible
see
#setSelected
see
#setClosed

        if (isVisible()) {
            setVisible(false);
        }
        if (isSelected()) {
            try {
                setSelected(false);
            } catch (PropertyVetoException pve) {}
        }
        if (!isClosed) {
	  firePropertyChange(IS_CLOSED_PROPERTY, Boolean.FALSE, Boolean.TRUE);
	  isClosed = true;
	}
	fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_CLOSED);
    
public voiddoDefaultCloseAction()
Fires an INTERNAL_FRAME_CLOSING event and then performs the action specified by the internal frame's default close operation. This method is typically invoked by the look-and-feel-implemented action handler for the internal frame's close button.

since
1.3
see
#setDefaultCloseOperation
see
javax.swing.event.InternalFrameEvent#INTERNAL_FRAME_CLOSING

        fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_CLOSING);
        switch(defaultCloseOperation) {
          case DO_NOTHING_ON_CLOSE:
	    break;
          case HIDE_ON_CLOSE:
            setVisible(false);
	    if (isSelected())
                try {
                    setSelected(false);
                } catch (PropertyVetoException pve) {}
	      
	    /* should this activate the next frame? that's really
	       desktopmanager's policy... */
            break;
          case DISPOSE_ON_CLOSE:
              try {
		fireVetoableChange(IS_CLOSED_PROPERTY, Boolean.FALSE,
				   Boolean.TRUE);
		isClosed = true;
                setVisible(false);
		firePropertyChange(IS_CLOSED_PROPERTY, Boolean.FALSE,
				   Boolean.TRUE);
		dispose();
	      } catch (PropertyVetoException pve) {}
              break;
          default: 
              break;
        }
    
protected voidfireInternalFrameEvent(int id)
Fires an internal frame event.

param
id the type of the event being fired; one of the following:
  • InternalFrameEvent.INTERNAL_FRAME_OPENED
  • InternalFrameEvent.INTERNAL_FRAME_CLOSING
  • InternalFrameEvent.INTERNAL_FRAME_CLOSED
  • InternalFrameEvent.INTERNAL_FRAME_ICONIFIED
  • InternalFrameEvent.INTERNAL_FRAME_DEICONIFIED
  • InternalFrameEvent.INTERNAL_FRAME_ACTIVATED
  • InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED
If the event type is not one of the above, nothing happens.

  
      Object[] listeners = listenerList.getListenerList();
      InternalFrameEvent e = null;
      for (int i = listeners.length -2; i >=0; i -= 2){
	if (listeners[i] == InternalFrameListener.class){
	  if (e == null){ 
	    e = new InternalFrameEvent(this, id);
	    //	    System.out.println("InternalFrameEvent: " + e.paramString());
	  }
	  switch(e.getID()) {
	  case InternalFrameEvent.INTERNAL_FRAME_OPENED:
	    ((InternalFrameListener)listeners[i+1]).internalFrameOpened(e);
	    break;
	  case InternalFrameEvent.INTERNAL_FRAME_CLOSING:
	    ((InternalFrameListener)listeners[i+1]).internalFrameClosing(e);
	    break;
	  case InternalFrameEvent.INTERNAL_FRAME_CLOSED:
	    ((InternalFrameListener)listeners[i+1]).internalFrameClosed(e);
	    break;
	  case InternalFrameEvent.INTERNAL_FRAME_ICONIFIED:
	    ((InternalFrameListener)listeners[i+1]).internalFrameIconified(e);
	    break;
	  case InternalFrameEvent.INTERNAL_FRAME_DEICONIFIED:
	    ((InternalFrameListener)listeners[i+1]).internalFrameDeiconified(e);
	    break;
	  case InternalFrameEvent.INTERNAL_FRAME_ACTIVATED:
	    ((InternalFrameListener)listeners[i+1]).internalFrameActivated(e);
	    break;
	  case InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED:
	    ((InternalFrameListener)listeners[i+1]).internalFrameDeactivated(e);
	    break;
	  default:
	    break;
	  }
	}
      }
      /* we could do it off the event, but at the moment, that's not how
	 I'm implementing it */
      //      if (id == InternalFrameEvent.INTERNAL_FRAME_CLOSING) {
      //	  doDefaultCloseAction();
      //      }
    
public javax.accessibility.AccessibleContextgetAccessibleContext()
Gets the AccessibleContext associated with this JInternalFrame. For internal frames, the AccessibleContext takes the form of an AccessibleJInternalFrame object. A new AccessibleJInternalFrame instance is created if necessary.

return
an AccessibleJInternalFrame that serves as the AccessibleContext of this JInternalFrame
see
AccessibleJInternalFrame

        if (accessibleContext == null) {
            accessibleContext = new AccessibleJInternalFrame();
        }
        return accessibleContext;
    
public java.awt.ContainergetContentPane()
Returns the content pane for this internal frame.

return
the content pane

        return getRootPane().getContentPane();
    
public intgetDefaultCloseOperation()
Returns the default operation that occurs when the user initiates a "close" on this internal frame.

return
the operation that will occur when the user closes the internal frame
see
#setDefaultCloseOperation

        return defaultCloseOperation;
    
public javax.swing.JInternalFrame$JDesktopIcongetDesktopIcon()
Returns the JDesktopIcon used when this JInternalFrame is iconified.

return
the JDesktopIcon displayed on the desktop
see
#setDesktopIcon

 
        return desktopIcon; 
    
public javax.swing.JDesktopPanegetDesktopPane()
Convenience method that searches the ancestor hierarchy for a JDesktop instance. If JInternalFrame finds none, the desktopIcon tree is searched.

return
the JDesktopPane this internal frame belongs to, or null if none is found

 
        Container p;

        // Search upward for desktop
        p = getParent();
        while(p != null && !(p instanceof JDesktopPane))
            p = p.getParent();
        
        if(p == null) {
           // search its icon parent for desktop
           p = getDesktopIcon().getParent();
           while(p != null && !(p instanceof JDesktopPane))
                p = p.getParent();
        }

        return (JDesktopPane)p; 
    
public final java.awt.ContainergetFocusCycleRootAncestor()
Always returns null because JInternalFrames must always be roots of a focus traversal cycle.

return
null
see
java.awt.Container#isFocusCycleRoot()
since
1.4

        return null;
    
public java.awt.ComponentgetFocusOwner()
If this JInternalFrame is active, returns the child that has focus. Otherwise, returns null.

return
the component with focus, or null if no children have focus
since
1.3

        if (isSelected()) {
            return lastFocusOwner;
        }
        return null;
    
public javax.swing.IcongetFrameIcon()
Returns the image displayed in the title bar of this internal frame (usually in the top-left corner).

return
the Icon displayed in the title bar
see
#setFrameIcon

        return frameIcon;
    
public java.awt.ComponentgetGlassPane()
Returns the glass pane for this internal frame.

return
the glass pane
see
RootPaneContainer#setGlassPane

 
        return getRootPane().getGlassPane(); 
    
public javax.swing.event.InternalFrameListener[]getInternalFrameListeners()
Returns an array of all the InternalFrameListeners added to this JInternalFrame with addInternalFrameListener.

return
all of the InternalFrameListeners added or an empty array if no listeners have been added
since
1.4
see
#addInternalFrameListener

        return (InternalFrameListener[])listenerList.getListeners(
                InternalFrameListener.class);
    
public javax.swing.JMenuBargetJMenuBar()
Returns the current JMenuBar for this JInternalFrame, or null if no menu bar has been set.

return
the JMenuBar used by this internal frame
see
#setJMenuBar

	return getRootPane().getJMenuBar();
    
public java.awt.CursorgetLastCursor()
Returns the last Cursor that was set by the setCursor method that is not a resizable Cursor.

return
the last non-resizable Cursor
since
1.6

        return lastCursor;
    
public intgetLayer()
Convenience method for getting the layer attribute of this component.

return
an Integer object specifying this frame's desktop layer
see
JLayeredPane

        return JLayeredPane.getLayer(this);
    
public javax.swing.JLayeredPanegetLayeredPane()
Returns the layered pane for this internal frame.

return
a JLayeredPane object
see
RootPaneContainer#setLayeredPane
see
RootPaneContainer#getLayeredPane

 
        return getRootPane().getLayeredPane(); 
    
public javax.swing.JMenuBargetMenuBar()
Returns the current JMenuBar for this JInternalFrame, or null if no menu bar has been set.

return
the current menu bar, or null if none has been set
deprecated
As of Swing version 1.0.3, replaced by getJMenuBar().

      return getRootPane().getMenuBar();
    
public java.awt.ComponentgetMostRecentFocusOwner()
Returns the child component of this JInternalFrame that will receive the focus when this JInternalFrame is selected. If this JInternalFrame is currently selected, this method returns the same component as the getFocusOwner method. If this JInternalFrame is not selected, then the child component that most recently requested focus will be returned. If no child component has ever requested focus, then this JInternalFrame's initial focusable component is returned. If no such child exists, then this JInternalFrame's default component to focus is returned.

return
the child component that will receive focus when this JInternalFrame is selected
see
#getFocusOwner
see
#isSelected
since
1.4

        if (isSelected()) {
            return getFocusOwner();
        }

        if (lastFocusOwner != null) {
            return lastFocusOwner;
        }

        FocusTraversalPolicy policy = getFocusTraversalPolicy();
        if (policy instanceof InternalFrameFocusTraversalPolicy) {
            return ((InternalFrameFocusTraversalPolicy)policy).
                getInitialComponent(this);
        }

        Component toFocus = policy.getDefaultComponent(this);
        if (toFocus != null) {
            return toFocus;
        }
        return getContentPane();
    
public java.awt.RectanglegetNormalBounds()
If the JInternalFrame is not in maximized state, returns getBounds(); otherwise, returns the bounds that the JInternalFrame would be restored to.

return
a Rectangle containing the bounds of this frame when in the normal state
since
1.3


      /* we used to test (!isMaximum) here, but since this
	 method is used by the property listener for the
	 IS_MAXIMUM_PROPERTY, it ended up getting the wrong
	 answer... Since normalBounds get set to null when the
	 frame is restored, this should work better */

      if (normalBounds != null) {
	return normalBounds;
      } else {
	return getBounds();
      }
    
public javax.swing.JRootPanegetRootPane()
Returns the rootPane object for this internal frame.

return
the rootPane property
see
RootPaneContainer#getRootPane

 
        return rootPane; 
    
public java.lang.StringgetTitle()
Returns the title of the JInternalFrame.

return
a String containing this internal frame's title
see
#setTitle

        return title;
    
public javax.swing.plaf.InternalFrameUIgetUI()
Returns the look-and-feel object that renders this component.

return
the InternalFrameUI object that renders this component

        return (InternalFrameUI)ui;
    
public java.lang.StringgetUIClassID()
Returns the name of the look-and-feel class that renders this component.

return
the string "InternalFrameUI"
see
JComponent#getUIClassID
see
UIDefaults#getUI
beaninfo
description: UIClassID

        return uiClassID;
    
public final java.lang.StringgetWarningString()
Gets the warning string that is displayed with this internal frame. Since an internal frame is always secure (since it's fully contained within a window that might need a warning string) this method always returns null.

return
null
see
java.awt.Window#getWarningString

        return null;
    
public voidhide()

        if (isIcon()) {
            getDesktopIcon().setVisible(false);
        }
        super.hide();
    
public booleanisClosable()
Returns whether this JInternalFrame can be closed by some user action.

return
true if this internal frame can be closed

        return closable;
    
public booleanisClosed()
Returns whether this JInternalFrame is currently closed.

return
true if this internal frame is closed, false otherwise

        return isClosed;
    
public final booleanisFocusCycleRoot()
Always returns true because all JInternalFrames must be roots of a focus traversal cycle.

return
true
see
#setFocusCycleRoot
see
java.awt.Container#setFocusTraversalPolicy
see
java.awt.Container#getFocusTraversalPolicy
since
1.4

        return true;
    
public booleanisIcon()
Returns whether the JInternalFrame is currently iconified.

return
true if this internal frame is iconified

        return isIcon;
    
public booleanisIconifiable()
Gets the iconable property, which by default is false.

return
the value of the iconable property.
see
#setIconifiable

        return iconable; 
    
public booleanisMaximizable()
Gets the value of the maximizable property.

return
the value of the maximizable property
see
#setMaximizable

        return maximizable; 
    
public booleanisMaximum()
Returns whether the JInternalFrame is currently maximized.

return
true if this internal frame is maximized, false otherwise

        return isMaximum;
    
public booleanisResizable()
Returns whether the JInternalFrame can be resized by some user action.

return
true if this internal frame can be resized, false otherwise

        // don't allow resizing when maximized.
        return isMaximum ? false : resizable; 
    
protected booleanisRootPaneCheckingEnabled()
Returns whether calls to add and setLayout are forwarded to the contentPane.

return
true if add and setLayout are fowarded; false otherwise
see
#addImpl
see
#setLayout
see
#setRootPaneCheckingEnabled
see
javax.swing.RootPaneContainer

        return rootPaneCheckingEnabled;
    
public booleanisSelected()
Returns whether the JInternalFrame is the currently "selected" or active frame.

return
true if this internal frame is currently selected (active)
see
#setSelected

        return isSelected;
    
public voidmoveToBack()
Convenience method that moves this component to position -1 if its parent is a JLayeredPane.

        if (isIcon()) {
            if (getDesktopIcon().getParent() instanceof JLayeredPane) {
                ((JLayeredPane)getDesktopIcon().getParent()).
                    moveToBack(getDesktopIcon());
            }
        }
        else if (getParent() instanceof JLayeredPane) {
            ((JLayeredPane)getParent()).moveToBack(this);
        }
    
public voidmoveToFront()
Convenience method that moves this component to position 0 if its parent is a JLayeredPane.

        if (isIcon()) {
            if (getDesktopIcon().getParent() instanceof JLayeredPane) {
                ((JLayeredPane)getDesktopIcon().getParent()).
                    moveToFront(getDesktopIcon());
            }
        }
        else if (getParent() instanceof JLayeredPane) {
            ((JLayeredPane)getParent()).moveToFront(this);
        }
    
public voidpack()
Causes subcomponents of this JInternalFrame to be laid out at their preferred size. Internal frames that are iconized or maximized are first restored and then packed. If the internal frame is unable to be restored its state is not changed and will not be packed.

see
java.awt.Window#pack

        try {
            if (isIcon()) {
                setIcon(false);
            } else if (isMaximum()) {
                setMaximum(false);
            }
        } catch(PropertyVetoException e) {
            return;
        }
        setSize(getPreferredSize());
        validate();
    
protected voidpaintComponent(java.awt.Graphics g)
Overridden to allow optimized painting when the internal frame is being dragged.


                        
        
      if (isDragging) {
	//	   System.out.println("ouch");
         danger = true;
      }

      super.paintComponent(g);
   
protected java.lang.StringparamString()
Returns a string representation of this JInternalFrame. This method is intended to be used only for debugging purposes, and the content and format of the returned string may vary between implementations. The returned string may be empty but may not be null.

return
a string representation of this JInternalFrame

	String rootPaneString = (rootPane != null ?
				 rootPane.toString() : "");
	String rootPaneCheckingEnabledString = (rootPaneCheckingEnabled ?
						"true" : "false");
	String closableString = (closable ? "true" : "false");
	String isClosedString = (isClosed ? "true" : "false");
	String maximizableString = (maximizable ? "true" : "false");
	String isMaximumString = (isMaximum ? "true" : "false");
	String iconableString = (iconable ? "true" : "false");
	String isIconString = (isIcon ? "true" : "false");
	String resizableString = (resizable ? "true" : "false");
	String isSelectedString = (isSelected ? "true" : "false");
	String frameIconString = (frameIcon != null ?
				  frameIcon.toString() : "");
	String titleString = (title != null ?
			      title : "");
	String desktopIconString = (desktopIcon != null ?
				    desktopIcon.toString() : "");
	String openedString = (opened ? "true" : "false");
        String defaultCloseOperationString;
        if (defaultCloseOperation == HIDE_ON_CLOSE) {
            defaultCloseOperationString = "HIDE_ON_CLOSE";
        } else if (defaultCloseOperation == DISPOSE_ON_CLOSE) {
            defaultCloseOperationString = "DISPOSE_ON_CLOSE";
        } else if (defaultCloseOperation == DO_NOTHING_ON_CLOSE) {
            defaultCloseOperationString = "DO_NOTHING_ON_CLOSE";
        } else defaultCloseOperationString = "";

	return super.paramString() +
	",closable=" + closableString +
	",defaultCloseOperation=" + defaultCloseOperationString +
	",desktopIcon=" + desktopIconString +
	",frameIcon=" + frameIconString +
	",iconable=" + iconableString +
	",isClosed=" + isClosedString +
	",isIcon=" + isIconString +
	",isMaximum=" + isMaximumString +
	",isSelected=" + isSelectedString +
	",maximizable=" + maximizableString +
	",opened=" + openedString +
	",resizable=" + resizableString +
	",rootPane=" + rootPaneString +
	",rootPaneCheckingEnabled=" + rootPaneCheckingEnabledString +
	",title=" + titleString;
    
public voidremove(java.awt.Component comp)
Removes the specified component from the container. If comp is not a child of the JInternalFrame this will forward the call to the contentPane.

param
comp the component to be removed
throws
NullPointerException if comp is null
see
#add
see
javax.swing.RootPaneContainer

	int oldCount = getComponentCount();
	super.remove(comp);
	if (oldCount == getComponentCount()) {
	    getContentPane().remove(comp);
	}
    
public voidremoveInternalFrameListener(javax.swing.event.InternalFrameListener l)
Removes the specified internal frame listener so that it no longer receives internal frame events from this internal frame.

param
l the internal frame listener

  // remind: sync??
      listenerList.remove(InternalFrameListener.class, l);
    
public voidreshape(int x, int y, int width, int height)
Moves and resizes this component. Unlike other components, this implementation also forces re-layout, so that frame decorations such as the title bar are always redisplayed.

param
x an integer giving the component's new horizontal position measured in pixels from the left of its container
param
y an integer giving the component's new vertical position, measured in pixels from the bottom of its container
param
width an integer giving the component's new width in pixels
param
height an integer giving the component's new height in pixels

        super.reshape(x, y, width, height);
        validate();
        repaint();
    
public voidrestoreSubcomponentFocus()
Requests the internal frame to restore focus to the last subcomponent that had focus. This is used by the UI when the user selected this internal frame -- for example, by clicking on the title bar.

since
1.3

        if (isIcon()) {
            SwingUtilities2.compositeRequestFocus(getDesktopIcon());
        }
        else {
            // FocusPropertyChangeListener will eventually update
            // lastFocusOwner. As focus requests are asynchronous
            // lastFocusOwner may be accessed before it has been correctly
            // updated. To avoid any problems, lastFocusOwner is immediately
            // set, assuming the request will succeed.
            lastFocusOwner = getMostRecentFocusOwner();
            if (lastFocusOwner == null) {
                // Make sure focus is restored somewhere, so that
                // we don't leave a focused component in another frame while
                // this frame is selected.
                lastFocusOwner = getContentPane();
            }
            lastFocusOwner.requestFocus();
        }
    
public voidsetClosable(boolean b)
Sets whether this JInternalFrame can be closed by some user action.

param
b a boolean value, where true means this internal frame can be closed
beaninfo
preferred: true bound: true description: Indicates whether this internal frame can be closed.

        Boolean oldValue = closable ? Boolean.TRUE : Boolean.FALSE; 
        Boolean newValue = b ? Boolean.TRUE : Boolean.FALSE;
        closable = b;
        firePropertyChange("closable", oldValue, newValue);
    
public voidsetClosed(boolean b)
Closes this internal frame if the argument is true. Do not invoke this method with a false argument; the result of invoking setClosed(false) is unspecified.

If the internal frame is already closed, this method does nothing and returns immediately. Otherwise, this method begins by firing an INTERNAL_FRAME_CLOSING event. Then this method sets the closed property to true unless a listener vetoes the property change. This method finishes by making the internal frame invisible and unselected, and then firing an INTERNAL_FRAME_CLOSED event.

Note: To reuse an internal frame that has been closed, you must add it to a container (even if you never removed it from its previous container). Typically, this container will be the JDesktopPane that previously contained the internal frame.

param
b must be true
exception
PropertyVetoException when the attempt to set the property is vetoed by the JInternalFrame
see
#isClosed()
see
#setDefaultCloseOperation
see
#dispose
see
javax.swing.event.InternalFrameEvent#INTERNAL_FRAME_CLOSING
beaninfo
bound: true constrained: true description: Indicates whether this internal frame has been closed.

        if (isClosed == b) {
            return;
        }

        Boolean oldValue = isClosed ? Boolean.TRUE : Boolean.FALSE; 
        Boolean newValue = b ? Boolean.TRUE : Boolean.FALSE;
	if (b) {
	  fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_CLOSING);
	}
        fireVetoableChange(IS_CLOSED_PROPERTY, oldValue, newValue);
        isClosed = b;
        if (isClosed) {
          setVisible(false);
        }
	firePropertyChange(IS_CLOSED_PROPERTY, oldValue, newValue);
        if (isClosed) {
	  dispose();
        } else if (!opened) {
	  /* this bogus -- we haven't defined what
	     setClosed(false) means. */
	  //	    fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_OPENED);
	  //            opened = true;
        }
    
public voidsetContentPane(java.awt.Container c)
Sets this JInternalFrame's contentPane property.

param
c the content pane for this internal frame
exception
java.awt.IllegalComponentStateException (a runtime exception) if the content pane parameter is null
see
RootPaneContainer#getContentPane
beaninfo
bound: true hidden: true description: The client area of the internal frame where child components are normally inserted.

        Container oldValue = getContentPane();
        getRootPane().setContentPane(c);
        firePropertyChange(CONTENT_PANE_PROPERTY, oldValue, c);
    
public voidsetCursor(java.awt.Cursor cursor)
{@inheritDoc}

since
1.6

        if (cursor == null) {
            lastCursor = null;
            super.setCursor(cursor);
            return;
        }
        int type = cursor.getType();
        if (!(type == Cursor.SW_RESIZE_CURSOR  || 
              type == Cursor.SE_RESIZE_CURSOR  ||
              type == Cursor.NW_RESIZE_CURSOR  ||
              type == Cursor.NE_RESIZE_CURSOR  ||
              type == Cursor.N_RESIZE_CURSOR   ||
              type == Cursor.S_RESIZE_CURSOR   ||
              type == Cursor.W_RESIZE_CURSOR   ||
              type == Cursor.E_RESIZE_CURSOR)) {
            lastCursor = cursor;
        }
        super.setCursor(cursor);
    
public voidsetDefaultCloseOperation(int operation)
Sets the operation that will happen by default when the user initiates a "close" on this internal frame. The possible choices are:

DO_NOTHING_ON_CLOSE
Do nothing. This requires the program to handle the operation in the windowClosing method of a registered InternalFrameListener object.
HIDE_ON_CLOSE
Automatically make the internal frame invisible.
DISPOSE_ON_CLOSE
Automatically dispose of the internal frame.

The default value is DISPOSE_ON_CLOSE. Before performing the specified close operation, the internal frame fires an INTERNAL_FRAME_CLOSING event.

param
operation one of the following constants defined in javax.swing.WindowConstants (an interface implemented by JInternalFrame): DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE
see
#addInternalFrameListener
see
#getDefaultCloseOperation
see
#setVisible
see
#dispose
see
InternalFrameEvent#INTERNAL_FRAME_CLOSING

        this.defaultCloseOperation = operation;
    
public voidsetDesktopIcon(javax.swing.JInternalFrame$JDesktopIcon d)
Sets the JDesktopIcon associated with this JInternalFrame.

param
d the JDesktopIcon to display on the desktop
see
#getDesktopIcon
beaninfo
bound: true description: The icon shown when this internal frame is minimized.

 
	JDesktopIcon oldValue = getDesktopIcon();
	desktopIcon = d; 
	firePropertyChange("desktopIcon", oldValue, d);
    
public final voidsetFocusCycleRoot(boolean focusCycleRoot)
Does nothing because JInternalFrames must always be roots of a focus traversal cycle.

param
focusCycleRoot this value is ignored
see
#isFocusCycleRoot
see
java.awt.Container#setFocusTraversalPolicy
see
java.awt.Container#getFocusTraversalPolicy
since
1.4

    
public voidsetFrameIcon(javax.swing.Icon icon)
Sets an image to be displayed in the titlebar of this internal frame (usually in the top-left corner). This image is not the desktopIcon object, which is the image displayed in the JDesktop when this internal frame is iconified. Passing null to this function is valid, but the look and feel can choose the appropriate behavior for that situation, such as displaying no icon or a default icon for the look and feel.

param
icon the Icon to display in the title bar
see
#getFrameIcon
beaninfo
bound: true description: The icon shown in the top-left corner of this internal frame.

        Icon oldIcon = frameIcon;
        frameIcon = icon;
        firePropertyChange(FRAME_ICON_PROPERTY, oldIcon, icon);  
    
public voidsetGlassPane(java.awt.Component glass)
Sets this JInternalFrame's glassPane property.

param
glass the glass pane for this internal frame
see
RootPaneContainer#getGlassPane
beaninfo
bound: true hidden: true description: A transparent pane used for menu rendering.

        Component oldValue = getGlassPane();
        getRootPane().setGlassPane(glass);
        firePropertyChange(GLASS_PANE_PROPERTY, oldValue, glass);       
    
public voidsetIcon(boolean b)
Iconifies or de-iconifies this internal frame, if the look and feel supports iconification. If the internal frame's state changes to iconified, this method fires an INTERNAL_FRAME_ICONIFIED event. If the state changes to de-iconified, an INTERNAL_FRAME_DEICONIFIED event is fired.

param
b a boolean, where true means to iconify this internal frame and false means to de-iconify it
exception
PropertyVetoException when the attempt to set the property is vetoed by the JInternalFrame
see
InternalFrameEvent#INTERNAL_FRAME_ICONIFIED
see
InternalFrameEvent#INTERNAL_FRAME_DEICONIFIED
beaninfo
bound: true constrained: true description: The image displayed when this internal frame is minimized.

        if (isIcon == b) {
            return;
        }

	/* If an internal frame is being iconified before it has a
	   parent, (e.g., client wants it to start iconic), create the
	   parent if possible so that we can place the icon in its
	   proper place on the desktop. I am not sure the call to
	   validate() is necessary, since we are not going to display
	   this frame yet */
        firePropertyChange("ancestor", null, getParent());

        Boolean oldValue = isIcon ? Boolean.TRUE : Boolean.FALSE; 
        Boolean newValue = b ? Boolean.TRUE : Boolean.FALSE;
        fireVetoableChange(IS_ICON_PROPERTY, oldValue, newValue);
        isIcon = b;
        firePropertyChange(IS_ICON_PROPERTY, oldValue, newValue);
	if (b)
	  fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_ICONIFIED);
	else
	  fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_DEICONIFIED);
    
public voidsetIconifiable(boolean b)
Sets the iconable property, which must be true for the user to be able to make the JInternalFrame an icon. Some look and feels might not implement iconification; they will ignore this property.

param
b a boolean, where true means this internal frame can be iconified
beaninfo
preferred: true bound: true description: Determines whether this internal frame can be iconified.

        Boolean oldValue = iconable ? Boolean.TRUE : Boolean.FALSE; 
        Boolean newValue = b ? Boolean.TRUE : Boolean.FALSE;
        iconable = b;
        firePropertyChange("iconable", oldValue, newValue);
    
public voidsetJMenuBar(javax.swing.JMenuBar m)
Sets the menuBar property for this JInternalFrame.

param
m the JMenuBar to use in this internal frame
see
#getJMenuBar
beaninfo
bound: true preferred: true description: The menu bar for accessing pulldown menus from this internal frame.

        JMenuBar oldValue = getMenuBar();
        getRootPane().setJMenuBar(m);
        firePropertyChange(MENU_BAR_PROPERTY, oldValue, m);     
    
private voidsetLastFocusOwner(java.awt.Component component)

        lastFocusOwner = component;
    
public voidsetLayer(java.lang.Integer layer)
Convenience method for setting the layer attribute of this component.

param
layer an Integer object specifying this frame's desktop layer
see
JLayeredPane
beaninfo
expert: true description: Specifies what desktop layer is used.

        if(getParent() != null && getParent() instanceof JLayeredPane) {
            // Normally we want to do this, as it causes the LayeredPane
            // to draw properly.
            JLayeredPane p = (JLayeredPane)getParent();
            p.setLayer(this, layer.intValue(), p.getPosition(this));
        } else {
             // Try to do the right thing
             JLayeredPane.putLayer(this, layer.intValue());
             if(getParent() != null)
                 getParent().repaint(getX(), getY(), getWidth(), getHeight());
        }
    
public voidsetLayer(int layer)
Convenience method for setting the layer attribute of this component. The method setLayer(Integer) should be used for layer values predefined in JLayeredPane. When using setLayer(int), care must be taken not to accidentally clash with those values.

param
layer an integer specifying this internal frame's desktop layer
since
1.3
see
#setLayer(Integer)
see
JLayeredPane
beaninfo
expert: true description: Specifies what desktop layer is used.

      this.setLayer(new Integer(layer));
    
public voidsetLayeredPane(javax.swing.JLayeredPane layered)
Sets this JInternalFrame's layeredPane property.

param
layered the JLayeredPane for this internal frame
exception
java.awt.IllegalComponentStateException (a runtime exception) if the layered pane parameter is null
see
RootPaneContainer#setLayeredPane
beaninfo
hidden: true bound: true description: The pane which holds the various desktop layers.

        JLayeredPane oldValue = getLayeredPane();
        getRootPane().setLayeredPane(layered);
        firePropertyChange(LAYERED_PANE_PROPERTY, oldValue, layered);   
    
public voidsetLayout(java.awt.LayoutManager manager)
Ensures that, by default, the layout of this component cannot be set. Overridden to conditionally forward the call to the contentPane. Refer to {@link javax.swing.RootPaneContainer} for more information.

param
manager the LayoutManager
see
#setRootPaneCheckingEnabled

        if(isRootPaneCheckingEnabled()) {
            getContentPane().setLayout(manager);
        }
        else {
            super.setLayout(manager);
        }
    
public voidsetMaximizable(boolean b)
Sets the maximizable property, which determines whether the JInternalFrame can be maximized by some user action. Some look and feels might not support maximizing internal frames; they will ignore this property.

param
b true to specify that this internal frame should be maximizable; false to specify that it should not be
beaninfo
bound: true preferred: true description: Determines whether this internal frame can be maximized.

        Boolean oldValue = maximizable ? Boolean.TRUE : Boolean.FALSE; 
        Boolean newValue = b ? Boolean.TRUE : Boolean.FALSE;
        maximizable = b;
        firePropertyChange("maximizable", oldValue, newValue);
    
public voidsetMaximum(boolean b)
Maximizes and restores this internal frame. A maximized frame is resized to fully fit the JDesktopPane area associated with the JInternalFrame. A restored frame's size is set to the JInternalFrame's actual size.

param
b a boolean, where true maximizes this internal frame and false restores it
exception
PropertyVetoException when the attempt to set the property is vetoed by the JInternalFrame
beaninfo
bound: true constrained: true description: Indicates whether this internal frame is maximized.

        if (isMaximum == b) {
            return;
        }

        Boolean oldValue = isMaximum ? Boolean.TRUE : Boolean.FALSE;
        Boolean newValue = b ? Boolean.TRUE : Boolean.FALSE;
        fireVetoableChange(IS_MAXIMUM_PROPERTY, oldValue, newValue);
	/* setting isMaximum above the event firing means that
	   property listeners that, for some reason, test it will
	   get it wrong... See, for example, getNormalBounds() */
        isMaximum = b;
        firePropertyChange(IS_MAXIMUM_PROPERTY, oldValue, newValue);
    
public voidsetMenuBar(javax.swing.JMenuBar m)
Sets the menuBar property for this JInternalFrame.

param
m the JMenuBar to use in this internal frame
see
#getJMenuBar
deprecated
As of Swing version 1.0.3 replaced by setJMenuBar(JMenuBar m).

        JMenuBar oldValue = getMenuBar();
        getRootPane().setJMenuBar(m);
        firePropertyChange(MENU_BAR_PROPERTY, oldValue, m);     
    
public voidsetNormalBounds(java.awt.Rectangle r)
Sets the normal bounds for this internal frame, the bounds that this internal frame would be restored to from its maximized state. This method is intended for use only by desktop managers.

param
r the bounds that this internal frame should be restored to
since
1.3

	normalBounds = r;
    
public voidsetResizable(boolean b)
Sets whether the JInternalFrame can be resized by some user action.

param
b a boolean, where true means this internal frame can be resized
beaninfo
preferred: true bound: true description: Determines whether this internal frame can be resized by the user.

        Boolean oldValue = resizable ? Boolean.TRUE : Boolean.FALSE; 
        Boolean newValue = b ? Boolean.TRUE : Boolean.FALSE;
        resizable = b;
        firePropertyChange("resizable", oldValue, newValue);
    
protected voidsetRootPane(javax.swing.JRootPane root)
Sets the rootPane property for this JInternalFrame. This method is called by the constructor.

param
root the new JRootPane object
beaninfo
bound: true hidden: true description: The root pane used by this internal frame.

        if(rootPane != null) {
            remove(rootPane);
        }
        JRootPane oldValue = getRootPane();
        rootPane = root;
        if(rootPane != null) {
            boolean checkingEnabled = isRootPaneCheckingEnabled();
            try {
                setRootPaneCheckingEnabled(false);
                add(rootPane, BorderLayout.CENTER);
            }
            finally {
                setRootPaneCheckingEnabled(checkingEnabled);
            }
        }
        firePropertyChange(ROOT_PANE_PROPERTY, oldValue, root); 
    
protected voidsetRootPaneCheckingEnabled(boolean enabled)
Sets whether calls to add and setLayout are forwarded to the contentPane.

param
enabled true if add and setLayout are forwarded, false if they should operate directly on the JInternalFrame.
see
#addImpl
see
#setLayout
see
#isRootPaneCheckingEnabled
see
javax.swing.RootPaneContainer
beaninfo
hidden: true description: Whether the add and setLayout methods are forwarded

        rootPaneCheckingEnabled = enabled;
    
public voidsetSelected(boolean selected)
Selects or deselects the internal frame if it's showing. A JInternalFrame normally draws its title bar differently if it is the selected frame, which indicates to the user that this internal frame has the focus. When this method changes the state of the internal frame from deselected to selected, it fires an InternalFrameEvent.INTERNAL_FRAME_ACTIVATED event. If the change is from selected to deselected, an InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED event is fired.

param
selected a boolean, where true means this internal frame should become selected (currently active) and false means it should become deselected
exception
PropertyVetoException when the attempt to set the property is vetoed by the JInternalFrame
see
#isShowing
see
InternalFrameEvent#INTERNAL_FRAME_ACTIVATED
see
InternalFrameEvent#INTERNAL_FRAME_DEACTIVATED
beaninfo
constrained: true bound: true description: Indicates whether this internal frame is currently the active frame.

       // The InternalFrame may already be selected, but the focus
       // may be outside it, so restore the focus to the subcomponent
       // which previously had it. See Bug 4302764.
        if (selected && isSelected) {
            restoreSubcomponentFocus();
            return;
        }
        // The internal frame or the desktop icon must be showing to allow
        // selection.  We may deselect even if neither is showing.
        if ((isSelected == selected) || (selected && 
            (isIcon ? !desktopIcon.isShowing() : !isShowing()))) {
            return;
        }

        Boolean oldValue = isSelected ? Boolean.TRUE : Boolean.FALSE;
        Boolean newValue = selected ? Boolean.TRUE : Boolean.FALSE;
        fireVetoableChange(IS_SELECTED_PROPERTY, oldValue, newValue);

	/* We don't want to leave focus in the previously selected
	   frame, so we have to set it to *something* in case it
	   doesn't get set in some other way (as if a user clicked on
	   a component that doesn't request focus).  If this call is
	   happening because the user clicked on a component that will
	   want focus, then it will get transfered there later.

	   We test for parent.isShowing() above, because AWT throws a
	   NPE if you try to request focus on a lightweight before its
	   parent has been made visible */

	if (selected) {
	    restoreSubcomponentFocus();
	} 

        isSelected = selected;
        firePropertyChange(IS_SELECTED_PROPERTY, oldValue, newValue);
	if (isSelected)
	  fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_ACTIVATED);
	else
	  fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED);	  
        repaint();
    
public voidsetTitle(java.lang.String title)
Sets the JInternalFrame title. title may have a null value.

see
#getTitle
param
title the String to display in the title bar
beaninfo
preferred: true bound: true description: The text displayed in the title bar.

        String oldValue = this.title;
        this.title = title;
        firePropertyChange(TITLE_PROPERTY, oldValue, title);
    
public voidsetUI(javax.swing.plaf.InternalFrameUI ui)
Sets the UI delegate for this JInternalFrame.

param
ui the UI delegate
beaninfo
bound: true hidden: true attribute: visualUpdate true description: The UI object that implements the Component's LookAndFeel.

        boolean checkingEnabled = isRootPaneCheckingEnabled();
        try {
            setRootPaneCheckingEnabled(false);
            super.setUI(ui);
        }
        finally {
            setRootPaneCheckingEnabled(checkingEnabled);
        }
    
public voidshow()
If the internal frame is not visible, brings the internal frame to the front, makes it visible, and attempts to select it. The first time the internal frame is made visible, this method also fires an INTERNAL_FRAME_OPENED event. This method does nothing if the internal frame is already visible. Invoking this method has the same result as invoking setVisible(true).

see
#moveToFront
see
#setSelected
see
InternalFrameEvent#INTERNAL_FRAME_OPENED
see
#setVisible

	// bug 4312922
	if (isVisible()) {
	    //match the behavior of setVisible(true): do nothing
	    return;
	}

	// bug 4149505
	if (!opened) {
	  fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_OPENED);
	  opened = true;
	}
	
        /* icon default visibility is false; set it to true so that it shows
           up when user iconifies frame */
        getDesktopIcon().setVisible(true);

	toFront();
	super.show();

	if (isIcon) {
	    return;
	}

        if (!isSelected()) {
            try {
                setSelected(true);
            } catch (PropertyVetoException pve) {}
        }
    
public voidtoBack()
Sends this internal frame to the back. Places this internal frame at the bottom of the stacking order and makes the corresponding adjustment to other visible internal frames.

see
java.awt.Window#toBack
see
#moveToBack

        moveToBack();
    
public voidtoFront()
Brings this internal frame to the front. Places this internal frame at the top of the stacking order and makes the corresponding adjustment to other visible internal frames.

see
java.awt.Window#toFront
see
#moveToFront

        moveToFront();
    
private static voidupdateLastFocusOwner(java.awt.Component component)

        if (component != null) {
            Component parent = component;
            while (parent != null && !(parent instanceof Window)) {
                if (parent instanceof JInternalFrame) {
                    // Update lastFocusOwner for parent.
                    ((JInternalFrame)parent).setLastFocusOwner(component);
                }
                parent = parent.getParent();
            }
        }
    
public voidupdateUI()
Notification from the UIManager that the look and feel has changed. Replaces the current UI object with the latest version from the UIManager.

see
JComponent#updateUI

        setUI((InternalFrameUI)UIManager.getUI(this));
        invalidate();
        if (desktopIcon != null) {
            desktopIcon.updateUIWhenHidden();
        }
    
voidupdateUIWhenHidden()

        setUI((InternalFrameUI)UIManager.getUI(this));
        invalidate();
        Component[] children = getComponents();
        if (children != null) {
            for(int i = 0; i < children.length; i++) {
                SwingUtilities.updateComponentTreeUI(children[i]);
            }
        }
    
private voidwriteObject(java.io.ObjectOutputStream s)
See readObject and writeObject in JComponent for more information about serialization in Swing.

        s.defaultWriteObject();
        if (getUIClassID().equals(uiClassID)) {
            byte count = JComponent.getWriteObjCounter(this);
            JComponent.setWriteObjCounter(this, --count);
            if (count == 0 && ui != null) {
                boolean old = isRootPaneCheckingEnabled();
                try {
                    setRootPaneCheckingEnabled(false);
                    ui.installUI(this);
                } finally {
                    setRootPaneCheckingEnabled(old);
                }
            }
        }