Method from java.awt.Container Detail: |
public Component add(Component comp) {
addImpl(comp, null, -1);
return comp;
}
Appends the specified component to the end of this container.
This is a convenience method for #addImpl .
This method changes layout-related information, and therefore,
invalidates the component hierarchy. If the container has already been
displayed, the hierarchy must be validated thereafter in order to
display the added component. |
public Component add(String name,
Component comp) {
addImpl(comp, name, -1);
return comp;
}
Adds the specified component to this container.
This is a convenience method for #addImpl .
This method is obsolete as of 1.1. Please use the
method add(Component, Object) instead.
This method changes layout-related information, and therefore,
invalidates the component hierarchy. If the container has already been
displayed, the hierarchy must be validated thereafter in order to
display the added component. |
public Component add(Component comp,
int index) {
addImpl(comp, null, index);
return comp;
}
Adds the specified component to this container at the given
position.
This is a convenience method for #addImpl .
This method changes layout-related information, and therefore,
invalidates the component hierarchy. If the container has already been
displayed, the hierarchy must be validated thereafter in order to
display the added component. |
public void add(Component comp,
Object constraints) {
addImpl(comp, constraints, -1);
}
Adds the specified component to the end of this container.
Also notifies the layout manager to add the component to
this container's layout using the specified constraints object.
This is a convenience method for #addImpl .
This method changes layout-related information, and therefore,
invalidates the component hierarchy. If the container has already been
displayed, the hierarchy must be validated thereafter in order to
display the added component. |
public void add(Component comp,
Object constraints,
int index) {
addImpl(comp, constraints, index);
}
Adds the specified component to this container with the specified
constraints at the specified index. Also notifies the layout
manager to add the component to the this container's layout using
the specified constraints object.
This is a convenience method for #addImpl .
This method changes layout-related information, and therefore,
invalidates the component hierarchy. If the container has already been
displayed, the hierarchy must be validated thereafter in order to
display the added component. |
public synchronized void addContainerListener(ContainerListener l) {
if (l == null) {
return;
}
containerListener = AWTEventMulticaster.add(containerListener, l);
newEventsOnly = true;
}
|
protected void addImpl(Component comp,
Object constraints,
int index) {
synchronized (getTreeLock()) {
/* Check for correct arguments: index in bounds,
* comp cannot be one of this container's parents,
* and comp cannot be a window.
* comp and container must be on the same GraphicsDevice.
* if comp is container, all sub-components must be on
* same GraphicsDevice.
*/
GraphicsConfiguration thisGC = this.getGraphicsConfiguration();
if (index > component.size() || (index < 0 && index != -1)) {
throw new IllegalArgumentException(
"illegal component position");
}
checkAddToSelf(comp);
checkNotAWindow(comp);
if (thisGC != null) {
comp.checkGD(thisGC.getDevice().getIDstring());
}
/* Reparent the component and tidy up the tree's state. */
if (comp.parent != null) {
comp.parent.remove(comp);
if (index > component.size()) {
throw new IllegalArgumentException("illegal component position");
}
}
//index == -1 means add to the end.
if (index == -1) {
component.add(comp);
} else {
component.add(index, comp);
}
comp.parent = this;
comp.setGraphicsConfiguration(thisGC);
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK));
adjustListeningChildren(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK,
comp.numListening(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK));
adjustDescendants(comp.countHierarchyMembers());
invalidateIfValid();
if (peer != null) {
comp.addNotify();
}
/* Notify the layout manager of the added component. */
if (layoutMgr != null) {
if (layoutMgr instanceof LayoutManager2) {
((LayoutManager2)layoutMgr).addLayoutComponent(comp, constraints);
} else if (constraints instanceof String) {
layoutMgr.addLayoutComponent((String)constraints, comp);
}
}
if (containerListener != null ||
(eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 ||
Toolkit.enabledOnToolkit(AWTEvent.CONTAINER_EVENT_MASK)) {
ContainerEvent e = new ContainerEvent(this,
ContainerEvent.COMPONENT_ADDED,
comp);
dispatchEvent(e);
}
comp.createHierarchyEvents(HierarchyEvent.HIERARCHY_CHANGED, comp,
this, HierarchyEvent.PARENT_CHANGED,
Toolkit.enabledOnToolkit(AWTEvent.HIERARCHY_EVENT_MASK));
if (peer != null && layoutMgr == null && isVisible()) {
updateCursorImmediately();
}
}
}
Adds the specified component to this container at the specified
index. This method also notifies the layout manager to add
the component to this container's layout using the specified
constraints object via the addLayoutComponent
method.
The constraints are
defined by the particular layout manager being used. For
example, the BorderLayout class defines five
constraints: BorderLayout.NORTH ,
BorderLayout.SOUTH , BorderLayout.EAST ,
BorderLayout.WEST , and BorderLayout.CENTER .
The GridBagLayout class requires a
GridBagConstraints object. Failure to pass
the correct type of constraints object results in an
IllegalArgumentException .
If the current layout manager implements {@code LayoutManager2}, then
LayoutManager2#addLayoutComponent(Component,Object) is invoked on
it. If the current layout manager does not implement
{@code LayoutManager2}, and constraints is a {@code String}, then
LayoutManager#addLayoutComponent(String,Component) is invoked on it.
If the component is not an ancestor of this container and has a non-null
parent, it is removed from its current parent before it is added to this
container.
This is the method to override if a program needs to track
every add request to a container as all other add methods defer
to this one. An overriding method should
usually include a call to the superclass's version of the method:
super.addImpl(comp, constraints, index)
This method changes layout-related information, and therefore,
invalidates the component hierarchy. If the container has already been
displayed, the hierarchy must be validated thereafter in order to
display the added component. |
public void addNotify() {
synchronized (getTreeLock()) {
// addNotify() on the children may cause proxy event enabling
// on this instance, so we first call super.addNotify() and
// possibly create an lightweight event dispatcher before calling
// addNotify() on the children which may be lightweight.
super.addNotify();
if (! (peer instanceof LightweightPeer)) {
dispatcher = new LightweightDispatcher(this);
}
// We shouldn't use iterator because of the Swing menu
// implementation specifics:
// the menu is being assigned as a child to JLayeredPane
// instead of particular component so always affect
// collection of component if menu is becoming shown or hidden.
for (int i = 0; i < component.size(); i++) {
component.get(i).addNotify();
}
}
}
Makes this Container displayable by connecting it to
a native screen resource. Making a container displayable will
cause all of its children to be made displayable.
This method is called internally by the toolkit and should
not be called directly by programs. |
public void addPropertyChangeListener(PropertyChangeListener listener) {
super.addPropertyChangeListener(listener);
}
Adds a PropertyChangeListener to the listener list. The listener is
registered for all bound properties of this class, including the
following:
- this Container's font ("font")
- this Container's background color ("background")
- this Container's foreground color ("foreground")
- this Container's focusability ("focusable")
- this Container's focus traversal keys enabled state
("focusTraversalKeysEnabled")
- this Container's Set of FORWARD_TRAVERSAL_KEYS
("forwardFocusTraversalKeys")
- this Container's Set of BACKWARD_TRAVERSAL_KEYS
("backwardFocusTraversalKeys")
- this Container's Set of UP_CYCLE_TRAVERSAL_KEYS
("upCycleFocusTraversalKeys")
- this Container's Set of DOWN_CYCLE_TRAVERSAL_KEYS
("downCycleFocusTraversalKeys")
- this Container's focus traversal policy ("focusTraversalPolicy")
- this Container's focus-cycle-root state ("focusCycleRoot")
Note that if this Container is inheriting a bound property, then no
event will be fired in response to a change in the inherited property.
If listener is null, no exception is thrown and no action is performed. |
public void addPropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
super.addPropertyChangeListener(propertyName, listener);
}
Adds a PropertyChangeListener to the listener list for a specific
property. The specified property may be user-defined, or one of the
following defaults:
- this Container's font ("font")
- this Container's background color ("background")
- this Container's foreground color ("foreground")
- this Container's focusability ("focusable")
- this Container's focus traversal keys enabled state
("focusTraversalKeysEnabled")
- this Container's Set of FORWARD_TRAVERSAL_KEYS
("forwardFocusTraversalKeys")
- this Container's Set of BACKWARD_TRAVERSAL_KEYS
("backwardFocusTraversalKeys")
- this Container's Set of UP_CYCLE_TRAVERSAL_KEYS
("upCycleFocusTraversalKeys")
- this Container's Set of DOWN_CYCLE_TRAVERSAL_KEYS
("downCycleFocusTraversalKeys")
- this Container's focus traversal policy ("focusTraversalPolicy")
- this Container's focus-cycle-root state ("focusCycleRoot")
- this Container's focus-traversal-policy-provider state("focusTraversalPolicyProvider")
- this Container's focus-traversal-policy-provider state("focusTraversalPolicyProvider")
Note that if this Container is inheriting a bound property, then no
event will be fired in response to a change in the inherited property.
If listener is null, no exception is thrown and no action is performed. |
void adjustDecendantsOnParent(int num) {
if (parent != null) {
parent.adjustDescendants(num);
}
}
|
void adjustDescendants(int num) {
if (num == 0)
return;
descendantsCount += num;
adjustDecendantsOnParent(num);
}
|
void adjustListeningChildren(long mask,
int num) {
if (eventLog.isLoggable(PlatformLogger.FINE)) {
boolean toAssert = (mask == AWTEvent.HIERARCHY_EVENT_MASK ||
mask == AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK ||
mask == (AWTEvent.HIERARCHY_EVENT_MASK |
AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK));
if (!toAssert) {
eventLog.fine("Assertion failed");
}
}
if (num == 0)
return;
if ((mask & AWTEvent.HIERARCHY_EVENT_MASK) != 0) {
listeningChildren += num;
}
if ((mask & AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK) != 0) {
listeningBoundsChildren += num;
}
adjustListeningChildrenOnParent(mask, num);
}
|
public void applyComponentOrientation(ComponentOrientation o) {
super.applyComponentOrientation(o);
synchronized (getTreeLock()) {
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
comp.applyComponentOrientation(o);
}
}
}
Sets the ComponentOrientation property of this container
and all components contained within it.
This method changes layout-related information, and therefore,
invalidates the component hierarchy. |
public boolean areFocusTraversalKeysSet(int id) {
if (id < 0 || id >= KeyboardFocusManager.TRAVERSAL_KEY_LENGTH) {
throw new IllegalArgumentException("invalid focus traversal key identifier");
}
return (focusTraversalKeys != null && focusTraversalKeys[id] != null);
}
Returns whether the Set of focus traversal keys for the given focus
traversal operation has been explicitly defined for this Container. If
this method returns false , this Container is inheriting the
Set from an ancestor, or from the current KeyboardFocusManager. |
boolean canContainFocusOwner(Component focusOwnerCandidate) {
if (!(isEnabled() && isDisplayable()
&& isVisible() && isFocusable()))
{
return false;
}
if (isFocusCycleRoot()) {
FocusTraversalPolicy policy = getFocusTraversalPolicy();
if (policy instanceof DefaultFocusTraversalPolicy) {
if (!((DefaultFocusTraversalPolicy)policy).accept(focusOwnerCandidate)) {
return false;
}
}
}
synchronized(getTreeLock()) {
if (parent != null) {
return parent.canContainFocusOwner(focusOwnerCandidate);
}
}
return true;
}
Checks whether this container can contain component which is focus owner.
Verifies that container is enable and showing, and if it is focus cycle root
its FTP allows component to be focus owner |
void checkGD(String stringID) {
for (Component comp : component) {
if (comp != null) {
comp.checkGD(stringID);
}
}
}
Checks that all Components that this Container contains are on
the same GraphicsDevice as this Container. If not, throws an
IllegalArgumentException. |
void clearCurrentFocusCycleRootOnHide() {
KeyboardFocusManager kfm =
KeyboardFocusManager.getCurrentKeyboardFocusManager();
Container cont = kfm.getCurrentFocusCycleRoot();
if (cont == this || isParentOf(cont)) {
kfm.setGlobalCurrentFocusCycleRoot(null);
}
}
|
void clearMostRecentFocusOwnerOnHide() {
boolean reset = false;
Window window = null;
synchronized (getTreeLock()) {
window = getContainingWindow();
if (window != null) {
Component comp = KeyboardFocusManager.getMostRecentFocusOwner(window);
reset = ((comp == this) || isParentOf(comp));
// This synchronized should always be the second in a pair
// (tree lock, KeyboardFocusManager.class)
synchronized(KeyboardFocusManager.class) {
Component storedComp = window.getTemporaryLostComponent();
if (isParentOf(storedComp) || storedComp == this) {
window.setTemporaryLostComponent(null);
}
}
}
}
if (reset) {
KeyboardFocusManager.setMostRecentFocusOwner(window, null);
}
}
|
final boolean containsFocus() {
final Component focusOwner = KeyboardFocusManager.
getCurrentKeyboardFocusManager().getFocusOwner();
return isParentOf(focusOwner);
}
|
public int countComponents() {
// This method is not synchronized under AWT tree lock.
// Instead, the calling code is responsible for the
// synchronization. See 6784816 for details.
return component.size();
} Deprecated! As - of JDK version 1.1,
replaced by getComponentCount().
|
int countHierarchyMembers() {
if (log.isLoggable(PlatformLogger.FINE)) {
// Verify descendantsCount is correct
int sum = 0;
for (Component comp : component) {
sum += comp.countHierarchyMembers();
}
if (descendantsCount != sum) {
log.fine("Assertion (descendantsCount == sum) failed");
}
}
return descendantsCount + 1;
}
|
final void createChildHierarchyEvents(int id,
long changeFlags,
boolean enabledOnToolkit) {
checkTreeLock();
if (component.isEmpty()) {
return;
}
int listeners = getListenersCount(id, enabledOnToolkit);
for (int count = listeners, i = 0; count > 0; i++) {
count -= component.get(i).createHierarchyEvents(id, this, parent,
changeFlags, enabledOnToolkit);
}
}
|
final int createHierarchyEvents(int id,
Component changed,
Container changedParent,
long changeFlags,
boolean enabledOnToolkit) {
checkTreeLock();
int listeners = getListenersCount(id, enabledOnToolkit);
for (int count = listeners, i = 0; count > 0; i++) {
count -= component.get(i).createHierarchyEvents(id, changed,
changedParent, changeFlags, enabledOnToolkit);
}
return listeners +
super.createHierarchyEvents(id, changed, changedParent,
changeFlags, enabledOnToolkit);
}
|
final void decreaseComponentCount(Component c) {
synchronized (getTreeLock()) {
if (!c.isDisplayable()) {
throw new IllegalStateException(
"Peer does not exist while invoking the decreaseComponentCount() method"
);
}
int subHW = 0;
int subLW = 0;
if (c instanceof Container) {
subLW = ((Container)c).numOfLWComponents;
subHW = ((Container)c).numOfHWComponents;
}
if (c.isLightweight()) {
subLW++;
} else {
subHW++;
}
for (Container cont = this; cont != null; cont = cont.getContainer()) {
cont.numOfLWComponents -= subLW;
cont.numOfHWComponents -= subHW;
}
}
}
|
public void deliverEvent(Event e) {
Component comp = getComponentAt(e.x, e.y);
if ((comp != null) && (comp != this)) {
e.translate(-comp.x, -comp.y);
comp.deliverEvent(e);
} else {
postEvent(e);
}
} Deprecated! As - of JDK version 1.1,
replaced by dispatchEvent(AWTEvent e)
|
void dispatchEventImpl(AWTEvent e) {
if ((dispatcher != null) && dispatcher.dispatchEvent(e)) {
// event was sent to a lightweight component. The
// native-produced event sent to the native container
// must be properly disposed of by the peer, so it
// gets forwarded. If the native host has been removed
// as a result of the sending the lightweight event,
// the peer reference will be null.
e.consume();
if (peer != null) {
peer.handleEvent(e);
}
return;
}
super.dispatchEventImpl(e);
synchronized (getTreeLock()) {
switch (e.getID()) {
case ComponentEvent.COMPONENT_RESIZED:
createChildHierarchyEvents(HierarchyEvent.ANCESTOR_RESIZED, 0,
Toolkit.enabledOnToolkit(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK));
break;
case ComponentEvent.COMPONENT_MOVED:
createChildHierarchyEvents(HierarchyEvent.ANCESTOR_MOVED, 0,
Toolkit.enabledOnToolkit(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK));
break;
default:
break;
}
}
}
|
void dispatchEventToSelf(AWTEvent e) {
super.dispatchEventImpl(e);
}
|
public void doLayout() {
layout();
}
Causes this container to lay out its components. Most programs
should not call this method directly, but should invoke
the validate method instead. |
boolean eventEnabled(AWTEvent e) {
int id = e.getID();
if (id == ContainerEvent.COMPONENT_ADDED ||
id == ContainerEvent.COMPONENT_REMOVED) {
if ((eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 ||
containerListener != null) {
return true;
}
return false;
}
return super.eventEnabled(e);
}
|
public Component findComponentAt(Point p) {
return findComponentAt(p.x, p.y);
}
Locates the visible child component that contains the specified
point. The top-most child component is returned in the case
where there is overlap in the components. If the containing child
component is a Container, this method will continue searching for
the deepest nested child component. Components which are not
visible are ignored during the search.
The findComponentAt method is different from getComponentAt in
that getComponentAt only searches the Container's immediate
children; if the containing component is a Container,
findComponentAt will search that child to find a nested component. |
public Component findComponentAt(int x,
int y) {
return findComponentAt(x, y, true);
}
Locates the visible child component that contains the specified
position. The top-most child component is returned in the case
where there is overlap in the components. If the containing child
component is a Container, this method will continue searching for
the deepest nested child component. Components which are not
visible are ignored during the search.
The findComponentAt method is different from getComponentAt in
that getComponentAt only searches the Container's immediate
children; if the containing component is a Container,
findComponentAt will search that child to find a nested component. |
final Component findComponentAt(int x,
int y,
boolean ignoreEnabled) {
synchronized (getTreeLock()) {
if (isRecursivelyVisible()){
return findComponentAtImpl(x, y, ignoreEnabled);
}
}
return null;
}
Private version of findComponentAt which has a controllable
behavior. Setting 'ignoreEnabled' to 'false' bypasses disabled
Components during the search. This behavior is used by the
lightweight cursor support in sun.awt.GlobalCursorManager.
The cursor code calls this function directly via native code.
The addition of this feature is temporary, pending the
adoption of new, public API which exports this feature. |
final Component findComponentAtImpl(int x,
int y,
boolean ignoreEnabled) {
checkTreeLock();
if (!(contains(x, y) && visible && (ignoreEnabled || enabled))) {
return null;
}
// Two passes: see comment in sun.awt.SunGraphicsCallback
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null &&
!(comp.peer instanceof LightweightPeer)) {
if (comp instanceof Container) {
comp = ((Container)comp).findComponentAtImpl(x - comp.x,
y - comp.y,
ignoreEnabled);
} else {
comp = comp.locate(x - comp.x, y - comp.y);
}
if (comp != null && comp.visible &&
(ignoreEnabled || comp.enabled))
{
return comp;
}
}
}
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null &&
comp.peer instanceof LightweightPeer) {
if (comp instanceof Container) {
comp = ((Container)comp).findComponentAtImpl(x - comp.x,
y - comp.y,
ignoreEnabled);
} else {
comp = comp.locate(x - comp.x, y - comp.y);
}
if (comp != null && comp.visible &&
(ignoreEnabled || comp.enabled))
{
return comp;
}
}
}
return this;
}
|
Accessible getAccessibleAt(Point p) {
synchronized (getTreeLock()) {
if (this instanceof Accessible) {
Accessible a = (Accessible)this;
AccessibleContext ac = a.getAccessibleContext();
if (ac != null) {
AccessibleComponent acmp;
Point location;
int nchildren = ac.getAccessibleChildrenCount();
for (int i=0; i < nchildren; i++) {
a = ac.getAccessibleChild(i);
if ((a != null)) {
ac = a.getAccessibleContext();
if (ac != null) {
acmp = ac.getAccessibleComponent();
if ((acmp != null) && (acmp.isShowing())) {
location = acmp.getLocation();
Point np = new Point(p.x-location.x,
p.y-location.y);
if (acmp.contains(np)){
return a;
}
}
}
}
}
}
return (Accessible)this;
} else {
Component ret = this;
if (!this.contains(p.x,p.y)) {
ret = null;
} else {
int ncomponents = this.getComponentCount();
for (int i=0; i < ncomponents; i++) {
Component comp = this.getComponent(i);
if ((comp != null) && comp.isShowing()) {
Point location = comp.getLocation();
if (comp.contains(p.x-location.x,p.y-location.y)) {
ret = comp;
}
}
}
}
if (ret instanceof Accessible) {
return (Accessible) ret;
}
}
return null;
}
}
Returns the Accessible child contained at the local
coordinate Point , if one exists. Otherwise
returns null . |
Accessible getAccessibleChild(int i) {
synchronized (getTreeLock()) {
Component[] children = this.getComponents();
int count = 0;
for (int j = 0; j < children.length; j++) {
if (children[j] instanceof Accessible) {
if (count == i) {
return (Accessible) children[j];
} else {
count++;
}
}
}
return null;
}
}
Returns the nth Accessible child of the object. |
int getAccessibleChildrenCount() {
synchronized (getTreeLock()) {
int count = 0;
Component[] children = this.getComponents();
for (int i = 0; i < children.length; i++) {
if (children[i] instanceof Accessible) {
count++;
}
}
return count;
}
}
Returns the number of accessible children in the object. If all
of the children of this object implement Accessible ,
then this method should return the number of children of this object. |
public float getAlignmentX() {
float xAlign;
if (layoutMgr instanceof LayoutManager2) {
synchronized (getTreeLock()) {
LayoutManager2 lm = (LayoutManager2) layoutMgr;
xAlign = lm.getLayoutAlignmentX(this);
}
} else {
xAlign = super.getAlignmentX();
}
return xAlign;
}
Returns the alignment along the x axis. This specifies how
the component would like to be aligned relative to other
components. The value should be a number between 0 and 1
where 0 represents alignment along the origin, 1 is aligned
the furthest away from the origin, 0.5 is centered, etc. |
public float getAlignmentY() {
float yAlign;
if (layoutMgr instanceof LayoutManager2) {
synchronized (getTreeLock()) {
LayoutManager2 lm = (LayoutManager2) layoutMgr;
yAlign = lm.getLayoutAlignmentY(this);
}
} else {
yAlign = super.getAlignmentY();
}
return yAlign;
}
Returns the alignment along the y axis. This specifies how
the component would like to be aligned relative to other
components. The value should be a number between 0 and 1
where 0 represents alignment along the origin, 1 is aligned
the furthest away from the origin, 0.5 is centered, etc. |
public Component getComponent(int n) {
// This method is not synchronized under AWT tree lock.
// Instead, the calling code is responsible for the
// synchronization. See 6784816 for details.
try {
return component.get(n);
} catch (IndexOutOfBoundsException z) {
throw new ArrayIndexOutOfBoundsException("No such child: " + n);
}
}
|
public Component getComponentAt(Point p) {
return getComponentAt(p.x, p.y);
}
Gets the component that contains the specified point. |
public Component getComponentAt(int x,
int y) {
return locate(x, y);
}
Locates the component that contains the x,y position. The
top-most child component is returned in the case where there
is overlap in the components. This is determined by finding
the component closest to the index 0 that claims to contain
the given point via Component.contains(), except that Components
which have native peers take precedence over those which do not
(i.e., lightweight Components). |
public int getComponentCount() {
return countComponents();
}
|
public int getComponentZOrder(Component comp) {
if (comp == null) {
return -1;
}
synchronized(getTreeLock()) {
// Quick check - container should be immediate parent of the component
if (comp.parent != this) {
return -1;
}
return component.indexOf(comp);
}
}
Returns the z-order index of the component inside the container.
The higher a component is in the z-order hierarchy, the lower
its index. The component with the lowest z-order index is
painted last, above all other child components. |
public Component[] getComponents() {
// This method is not synchronized under AWT tree lock.
// Instead, the calling code is responsible for the
// synchronization. See 6784816 for details.
return getComponents_NoClientCode();
}
|
Component[] getComponentsSync() {
synchronized (getTreeLock()) {
return getComponents();
}
}
|
final Component[] getComponents_NoClientCode() {
return component.toArray(EMPTY_ARRAY);
}
|
public synchronized ContainerListener[] getContainerListeners() {
return (ContainerListener[]) (getListeners(ContainerListener.class));
}
Returns an array of all the container listeners
registered on this container. |
Component getDropTargetEventTarget(int x,
int y,
boolean includeSelf) {
return getMouseEventTarget(x, y, includeSelf,
DropTargetEventTargetFilter.FILTER,
SEARCH_HEAVYWEIGHTS);
}
Fetches the top-most (deepest) component to receive SunDropTargetEvents. |
public Set<AWTKeyStroke> getFocusTraversalKeys(int id) {
if (id < 0 || id >= KeyboardFocusManager.TRAVERSAL_KEY_LENGTH) {
throw new IllegalArgumentException("invalid focus traversal key identifier");
}
// Don't call super.getFocusTraversalKey. The Component parameter check
// does not allow DOWN_CYCLE_TRAVERSAL_KEY, but we do.
return getFocusTraversalKeys_NoIDCheck(id);
}
Returns the Set of focus traversal keys for a given traversal operation
for this Container. (See
setFocusTraversalKeys for a full description of each key.)
If a Set of traversal keys has not been explicitly defined for this
Container, then this Container's parent's Set is returned. If no Set
has been explicitly defined for any of this Container's ancestors, then
the current KeyboardFocusManager's default Set is returned. |
public FocusTraversalPolicy getFocusTraversalPolicy() {
if (!isFocusTraversalPolicyProvider() && !isFocusCycleRoot()) {
return null;
}
FocusTraversalPolicy policy = this.focusTraversalPolicy;
if (policy != null) {
return policy;
}
Container rootAncestor = getFocusCycleRootAncestor();
if (rootAncestor != null) {
return rootAncestor.getFocusTraversalPolicy();
} else {
return KeyboardFocusManager.getCurrentKeyboardFocusManager().
getDefaultFocusTraversalPolicy();
}
}
Returns the focus traversal policy that will manage keyboard traversal
of this Container's children, or null if this Container is not a focus
cycle root. If no traversal policy has been explicitly set for this
Container, then this Container's focus-cycle-root ancestor's policy is
returned. |
Container getHeavyweightContainer() {
checkTreeLock();
if (peer != null && !(peer instanceof LightweightPeer)) {
return this;
} else {
return getNativeContainer();
}
}
Returns closest heavyweight component to this container. If this container is heavyweight
returns this. |
public Insets getInsets() {
return insets();
}
Determines the insets of this container, which indicate the size
of the container's border.
A Frame object, for example, has a top inset that
corresponds to the height of the frame's title bar. |
public LayoutManager getLayout() {
return layoutMgr;
}
Gets the layout manager for this container. |
public T[] getListeners(Class<T> listenerType) {
EventListener l = null;
if (listenerType == ContainerListener.class) {
l = containerListener;
} else {
return super.getListeners(listenerType);
}
return AWTEventMulticaster.getListeners(l, listenerType);
}
Returns an array of all the objects currently registered
as FooListener s
upon this Container .
FooListener s are registered using the
addFooListener method.
You can specify the listenerType argument
with a class literal, such as
FooListener.class .
For example, you can query a
Container c
for its container listeners with the following code:
ContainerListener[] cls = (ContainerListener[])(c.getListeners(ContainerListener.class));
If no such listeners exist, this method returns an empty array. |
public Dimension getMaximumSize() {
/* Avoid grabbing the lock if a reasonable cached size value
* is available.
*/
Dimension dim = maxSize;
if (dim == null || !(isMaximumSizeSet() || isValid())) {
synchronized (getTreeLock()) {
if (layoutMgr instanceof LayoutManager2) {
LayoutManager2 lm = (LayoutManager2) layoutMgr;
maxSize = lm.maximumLayoutSize(this);
} else {
maxSize = super.getMaximumSize();
}
dim = maxSize;
}
}
if (dim != null){
return new Dimension(dim);
}
else{
return dim;
}
}
Returns the maximum size of this container. If the maximum size has
not been set explicitly by Component#setMaximumSize(Dimension)
and the LayoutManager installed on this {@code Container}
is an instance of LayoutManager2 , then
LayoutManager2#maximumLayoutSize(Container)
is used to calculate the maximum size.
Note: some implementations may cache the value returned from the
{@code LayoutManager2}. Implementations that cache need not invoke
{@code maximumLayoutSize} on the {@code LayoutManager2} every time
this method is invoked, rather the {@code LayoutManager2} will only
be queried after the {@code Container} becomes invalid. |
public Dimension getMinimumSize() {
return minimumSize();
}
Returns the minimum size of this container. If the minimum size has
not been set explicitly by Component#setMinimumSize(Dimension)
and this {@code Container} has a {@code non-null} LayoutManager ,
then LayoutManager#minimumLayoutSize(Container)
is used to calculate the minimum size.
Note: some implementations may cache the value returned from the
{@code LayoutManager}. Implementations that cache need not invoke
{@code minimumLayoutSize} on the {@code LayoutManager} every time
this method is invoked, rather the {@code LayoutManager} will only
be queried after the {@code Container} becomes invalid. |
Component getMouseEventTarget(int x,
int y,
boolean includeSelf) {
return getMouseEventTarget(x, y, includeSelf,
MouseEventTargetFilter.FILTER,
!SEARCH_HEAVYWEIGHTS);
}
Fetchs the top-most (deepest) lightweight component that is interested
in receiving mouse events. |
public Point getMousePosition(boolean allowChildren) throws HeadlessException {
if (GraphicsEnvironment.isHeadless()) {
throw new HeadlessException();
}
PointerInfo pi = (PointerInfo)java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction() {
public Object run() {
return MouseInfo.getPointerInfo();
}
}
);
synchronized (getTreeLock()) {
Component inTheSameWindow = findUnderMouseInWindow(pi);
if (isSameOrAncestorOf(inTheSameWindow, allowChildren)) {
return pointRelativeToComponent(pi.getLocation());
}
return null;
}
}
Returns the position of the mouse pointer in this Container 's
coordinate space if the Container is under the mouse pointer,
otherwise returns null .
This method is similar to Component#getMousePosition() with the exception
that it can take the Container 's children into account.
If allowChildren is false , this method will return
a non-null value only if the mouse pointer is above the Container
directly, not above the part obscured by children.
If allowChildren is true , this method returns
a non-null value if the mouse pointer is above Container or any
of its descendants. |
final Region getOpaqueShape() {
checkTreeLock();
if (isLightweight() && isNonOpaqueForMixing()
&& hasLightweightDescendants())
{
Region s = Region.EMPTY_REGION;
for (int index = 0; index < getComponentCount(); index++) {
Component c = getComponent(index);
if (c.isLightweight() && c.isShowing()) {
s = s.getUnion(c.getOpaqueShape());
}
}
return s.getIntersection(getNormalShape());
}
return super.getOpaqueShape();
}
|
public Dimension getPreferredSize() {
return preferredSize();
}
Returns the preferred size of this container. If the preferred size has
not been set explicitly by Component#setPreferredSize(Dimension)
and this {@code Container} has a {@code non-null} LayoutManager ,
then LayoutManager#preferredLayoutSize(Container)
is used to calculate the preferred size.
Note: some implementations may cache the value returned from the
{@code LayoutManager}. Implementations that cache need not invoke
{@code preferredLayoutSize} on the {@code LayoutManager} every time
this method is invoked, rather the {@code LayoutManager} will only
be queried after the {@code Container} becomes invalid. |
final Container getTraversalRoot() {
if (isFocusCycleRoot()) {
return findTraversalRoot();
}
return super.getTraversalRoot();
}
|
final boolean hasHeavyweightDescendants() {
checkTreeLock();
return numOfHWComponents > 0;
}
Checks whether or not this container has heavyweight children.
Note: Should be called while holding tree lock |
final boolean hasLightweightDescendants() {
checkTreeLock();
return numOfLWComponents > 0;
}
Checks whether or not this container has lightweight children.
Note: Should be called while holding tree lock |
final void increaseComponentCount(Component c) {
synchronized (getTreeLock()) {
if (!c.isDisplayable()) {
throw new IllegalStateException(
"Peer does not exist while invoking the increaseComponentCount() method"
);
}
int addHW = 0;
int addLW = 0;
if (c instanceof Container) {
addLW = ((Container)c).numOfLWComponents;
addHW = ((Container)c).numOfHWComponents;
}
if (c.isLightweight()) {
addLW++;
} else {
addHW++;
}
for (Container cont = this; cont != null; cont = cont.getContainer()) {
cont.numOfLWComponents += addLW;
cont.numOfHWComponents += addHW;
}
}
}
|
void initializeFocusTraversalKeys() {
focusTraversalKeys = new Set[4];
}
|
public Insets insets() {
ComponentPeer peer = this.peer;
if (peer instanceof ContainerPeer) {
ContainerPeer cpeer = (ContainerPeer)peer;
return (Insets)cpeer.getInsets().clone();
}
return new Insets(0, 0, 0, 0);
} Deprecated! As - of JDK version 1.1,
replaced by getInsets() .
|
public void invalidate() {
LayoutManager layoutMgr = this.layoutMgr;
if (layoutMgr instanceof LayoutManager2) {
LayoutManager2 lm = (LayoutManager2) layoutMgr;
lm.invalidateLayout(this);
}
super.invalidate();
}
Invalidates the container.
If the {@code LayoutManager} installed on this container is an instance
of the {@code LayoutManager2} interface, then
the LayoutManager2#invalidateLayout(Container) method is invoked
on it supplying this {@code Container} as the argument.
Afterwards this method marks this container invalid, and invalidates its
ancestors. See the Component#invalidate method for more details. |
void invalidateParent() {
if (!isJavaAwtSmartInvalidate || !isValidateRoot()) {
super.invalidateParent();
}
}
Invalidates the parent of the container unless the container
is a validate root. |
void invalidateTree() {
synchronized (getTreeLock()) {
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp instanceof Container) {
((Container)comp).invalidateTree();
}
else {
comp.invalidateIfValid();
}
}
invalidateIfValid();
}
}
Recursively descends the container tree and invalidates all
contained components. |
public boolean isAncestorOf(Component c) {
Container p;
if (c == null || ((p = c.getParent()) == null)) {
return false;
}
while (p != null) {
if (p == this) {
return true;
}
p = p.getParent();
}
return false;
}
Checks if the component is contained in the component hierarchy of
this container. |
public boolean isFocusCycleRoot() {
return focusCycleRoot;
}
Returns whether this Container is the root of a focus traversal cycle.
Once focus enters a traversal cycle, typically it cannot leave it via
focus traversal unless one of the up- or down-cycle keys is pressed.
Normal traversal is limited to this Container, and all of this
Container's descendants that are not descendants of inferior focus
cycle roots. Note that a FocusTraversalPolicy may bend these
restrictions, however. For example, ContainerOrderFocusTraversalPolicy
supports implicit down-cycle traversal. |
public boolean isFocusCycleRoot(Container container) {
if (isFocusCycleRoot() && container == this) {
return true;
} else {
return super.isFocusCycleRoot(container);
}
}
Returns whether the specified Container is the focus cycle root of this
Container's focus traversal cycle. Each focus traversal cycle has only
a single focus cycle root and each Container which is not a focus cycle
root belongs to only a single focus traversal cycle. Containers which
are focus cycle roots belong to two cycles: one rooted at the Container
itself, and one rooted at the Container's nearest focus-cycle-root
ancestor. This method will return true for both such
Containers in this case. |
public final boolean isFocusTraversalPolicyProvider() {
return focusTraversalPolicyProvider;
}
Returns whether this container provides focus traversal
policy. If this property is set to true then when
keyboard focus manager searches container hierarchy for focus
traversal policy and encounters this container before any other
container with this property as true or focus cycle roots then
its focus traversal policy will be used instead of focus cycle
root's policy. |
public boolean isFocusTraversalPolicySet() {
return (focusTraversalPolicy != null);
}
Returns whether the focus traversal policy has been explicitly set for
this Container. If this method returns false , this
Container will inherit its focus traversal policy from an ancestor. |
final boolean isRecursivelyVisibleUpToHeavyweightContainer() {
if (!isLightweight()) {
return true;
}
for (Container cont = this;
cont != null && cont.isLightweight();
cont = cont.getContainer())
{
if (!cont.isVisible()) {
return false;
}
}
return true;
}
Checks if the container and its direct lightweight containers are
visible.
Consider the heavyweight container hides or shows the HW descendants
automatically. Therefore we care of LW containers' visibility only.
This method MUST be invoked under the TreeLock. |
boolean isSameOrAncestorOf(Component comp,
boolean allowChildren) {
return this == comp || (allowChildren && isParentOf(comp));
}
|
public boolean isValidateRoot() {
return false;
}
Indicates if this container is a validate root.
Layout-related changes, such as bounds of the validate root descendants,
do not affect the layout of the validate root parent. This peculiarity
enables the {@code invalidate()} method to stop invalidating the
component hierarchy when the method encounters a validate root. However,
to preserve backward compatibility this new optimized behavior is
enabled only when the {@code java.awt.smartInvalidate} system property
value is set to {@code true}.
If a component hierarchy contains validate roots and the new optimized
{@code invalidate()} behavior is enabled, the {@code validate()} method
must be invoked on the validate root of a previously invalidated
component to restore the validity of the hierarchy later. Otherwise,
calling the {@code validate()} method on the top-level container (such
as a {@code Frame} object) should be used to restore the validity of the
component hierarchy.
The {@code Window} class and the {@code Applet} class are the validate
roots in AWT. Swing introduces more validate roots. |
public void layout() {
LayoutManager layoutMgr = this.layoutMgr;
if (layoutMgr != null) {
layoutMgr.layoutContainer(this);
}
} Deprecated! As - of JDK version 1.1,
replaced by doLayout() .
|
void lightweightPaint(Graphics g) {
super.lightweightPaint(g);
paintHeavyweightComponents(g);
}
Simulates the peer callbacks into java.awt for printing of
lightweight Containers. |
void lightweightPrint(Graphics g) {
super.lightweightPrint(g);
printHeavyweightComponents(g);
}
Simulates the peer callbacks into java.awt for printing of
lightweight Containers. |
public void list(PrintStream out,
int indent) {
super.list(out, indent);
synchronized(getTreeLock()) {
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null) {
comp.list(out, indent+1);
}
}
}
}
Prints a listing of this container to the specified output
stream. The listing starts at the specified indentation.
The immediate children of the container are printed with
an indentation of indent+1 . The children
of those children are printed at indent+2
and so on. |
public void list(PrintWriter out,
int indent) {
super.list(out, indent);
synchronized(getTreeLock()) {
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null) {
comp.list(out, indent+1);
}
}
}
}
Prints out a list, starting at the specified indentation,
to the specified print writer.
The immediate children of the container are printed with
an indentation of indent+1 . The children
of those children are printed at indent+2
and so on. |
public Component locate(int x,
int y) {
if (!contains(x, y)) {
return null;
}
synchronized (getTreeLock()) {
// Two passes: see comment in sun.awt.SunGraphicsCallback
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null &&
!(comp.peer instanceof LightweightPeer)) {
if (comp.contains(x - comp.x, y - comp.y)) {
return comp;
}
}
}
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null &&
comp.peer instanceof LightweightPeer) {
if (comp.contains(x - comp.x, y - comp.y)) {
return comp;
}
}
}
}
return this;
} Deprecated! As - of JDK version 1.1,
replaced by getComponentAt(int, int) .
|
public Dimension minimumSize() {
/* Avoid grabbing the lock if a reasonable cached size value
* is available.
*/
Dimension dim = minSize;
if (dim == null || !(isMinimumSizeSet() || isValid())) {
synchronized (getTreeLock()) {
minSize = (layoutMgr != null) ?
layoutMgr.minimumLayoutSize(this) :
super.minimumSize();
dim = minSize;
}
}
if (dim != null){
return new Dimension(dim);
}
else{
return dim;
}
} Deprecated! As - of JDK version 1.1,
replaced by getMinimumSize() .
|
void mixOnHiding(boolean isLightweight) {
synchronized (getTreeLock()) {
if (mixingLog.isLoggable(PlatformLogger.FINE)) {
mixingLog.fine("this = " + this +
"; isLightweight=" + isLightweight);
}
if (isLightweight) {
recursiveHideHeavyweightChildren();
}
super.mixOnHiding(isLightweight);
}
}
|
void mixOnReshaping() {
synchronized (getTreeLock()) {
if (mixingLog.isLoggable(PlatformLogger.FINE)) {
mixingLog.fine("this = " + this);
}
boolean isMixingNeeded = isMixingNeeded();
if (isLightweight() && hasHeavyweightDescendants()) {
final Point origin = new Point(getX(), getY());
for (Container cont = getContainer();
cont != null && cont.isLightweight();
cont = cont.getContainer())
{
origin.translate(cont.getX(), cont.getY());
}
recursiveRelocateHeavyweightChildren(origin);
if (!isMixingNeeded) {
return;
}
recursiveApplyCurrentShape();
}
if (!isMixingNeeded) {
return;
}
super.mixOnReshaping();
}
}
|
void mixOnShowing() {
synchronized (getTreeLock()) {
if (mixingLog.isLoggable(PlatformLogger.FINE)) {
mixingLog.fine("this = " + this);
}
boolean isLightweight = isLightweight();
if (isLightweight && isRecursivelyVisibleUpToHeavyweightContainer()) {
recursiveShowHeavyweightChildren();
}
if (!isMixingNeeded()) {
return;
}
if (!isLightweight || (isLightweight && hasHeavyweightDescendants())) {
recursiveApplyCurrentShape();
}
super.mixOnShowing();
}
}
|
void mixOnValidating() {
synchronized (getTreeLock()) {
if (mixingLog.isLoggable(PlatformLogger.FINE)) {
mixingLog.fine("this = " + this);
}
if (!isMixingNeeded()) {
return;
}
if (hasHeavyweightDescendants()) {
recursiveApplyCurrentShape();
}
if (isLightweight() && isNonOpaqueForMixing()) {
subtractAndApplyShapeBelowMe();
}
super.mixOnValidating();
}
}
|
void mixOnZOrderChanging(int oldZorder,
int newZorder) {
synchronized (getTreeLock()) {
if (mixingLog.isLoggable(PlatformLogger.FINE)) {
mixingLog.fine("this = " + this +
"; oldZ=" + oldZorder + "; newZ=" + newZorder);
}
if (!isMixingNeeded()) {
return;
}
boolean becameHigher = newZorder < oldZorder;
if (becameHigher && isLightweight() && hasHeavyweightDescendants()) {
recursiveApplyCurrentShape();
}
super.mixOnZOrderChanging(oldZorder, newZorder);
}
}
|
int numListening(long mask) {
int superListening = super.numListening(mask);
if (mask == AWTEvent.HIERARCHY_EVENT_MASK) {
if (eventLog.isLoggable(PlatformLogger.FINE)) {
// Verify listeningChildren is correct
int sum = 0;
for (Component comp : component) {
sum += comp.numListening(mask);
}
if (listeningChildren != sum) {
eventLog.fine("Assertion (listeningChildren == sum) failed");
}
}
return listeningChildren + superListening;
} else if (mask == AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK) {
if (eventLog.isLoggable(PlatformLogger.FINE)) {
// Verify listeningBoundsChildren is correct
int sum = 0;
for (Component comp : component) {
sum += comp.numListening(mask);
}
if (listeningBoundsChildren != sum) {
eventLog.fine("Assertion (listeningBoundsChildren == sum) failed");
}
}
return listeningBoundsChildren + superListening;
} else {
// assert false;
if (eventLog.isLoggable(PlatformLogger.FINE)) {
eventLog.fine("This code must never be reached");
}
return superListening;
}
}
|
public void paint(Graphics g) {
if (isShowing()) {
synchronized (this) {
if (printing) {
if (printingThreads.contains(Thread.currentThread())) {
return;
}
}
}
// The container is showing on screen and
// this paint() is not called from print().
// Paint self and forward the paint to lightweight subcomponents.
// super.paint(); -- Don't bother, since it's a NOP.
GraphicsCallback.PaintCallback.getInstance().
runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS);
}
}
Paints the container. This forwards the paint to any lightweight
components that are children of this container. If this method is
reimplemented, super.paint(g) should be called so that lightweight
components are properly rendered. If a child component is entirely
clipped by the current clipping setting in g, paint() will not be
forwarded to that child. |
public void paintComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PaintAllCallback.getInstance().
runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES);
}
}
Paints each of the components in this container. |
void paintHeavyweightComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PaintHeavyweightComponentsCallback.getInstance().
runComponents(getComponentsSync(), g,
GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS);
}
}
Prints all the heavyweight subcomponents. |
protected String paramString() {
String str = super.paramString();
LayoutManager layoutMgr = this.layoutMgr;
if (layoutMgr != null) {
str += ",layout=" + layoutMgr.getClass().getName();
}
return str;
}
Returns a string representing the state of this Container .
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 . |
void postProcessKeyEvent(KeyEvent e) {
Container parent = this.parent;
if (parent != null) {
parent.postProcessKeyEvent(e);
}
}
|
boolean postsOldMouseEvents() {
return true;
}
|
void preProcessKeyEvent(KeyEvent e) {
Container parent = this.parent;
if (parent != null) {
parent.preProcessKeyEvent(e);
}
}
|
public Dimension preferredSize() {
/* Avoid grabbing the lock if a reasonable cached size value
* is available.
*/
Dimension dim = prefSize;
if (dim == null || !(isPreferredSizeSet() || isValid())) {
synchronized (getTreeLock()) {
prefSize = (layoutMgr != null) ?
layoutMgr.preferredLayoutSize(this) :
super.preferredSize();
dim = prefSize;
}
}
if (dim != null){
return new Dimension(dim);
}
else{
return dim;
}
} Deprecated! As - of JDK version 1.1,
replaced by getPreferredSize() .
|
public void print(Graphics g) {
if (isShowing()) {
Thread t = Thread.currentThread();
try {
synchronized (this) {
if (printingThreads == null) {
printingThreads = new HashSet();
}
printingThreads.add(t);
printing = true;
}
super.print(g); // By default, Component.print() calls paint()
} finally {
synchronized (this) {
printingThreads.remove(t);
printing = !printingThreads.isEmpty();
}
}
GraphicsCallback.PrintCallback.getInstance().
runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS);
}
}
Prints the container. This forwards the print to any lightweight
components that are children of this container. If this method is
reimplemented, super.print(g) should be called so that lightweight
components are properly rendered. If a child component is entirely
clipped by the current clipping setting in g, print() will not be
forwarded to that child. |
public void printComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PrintAllCallback.getInstance().
runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES);
}
}
Prints each of the components in this container. |
void printHeavyweightComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PrintHeavyweightComponentsCallback.getInstance().
runComponents(getComponentsSync(), g,
GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS);
}
}
Prints all the heavyweight subcomponents. |
protected void processContainerEvent(ContainerEvent e) {
ContainerListener listener = containerListener;
if (listener != null) {
switch(e.getID()) {
case ContainerEvent.COMPONENT_ADDED:
listener.componentAdded(e);
break;
case ContainerEvent.COMPONENT_REMOVED:
listener.componentRemoved(e);
break;
}
}
}
Processes container events occurring on this container by
dispatching them to any registered ContainerListener objects.
NOTE: This method will not be called unless container events
are enabled for this component; this happens when one of the
following occurs:
- A ContainerListener object is registered via
addContainerListener
- Container events are enabled via
enableEvents
Note that if the event parameter is null
the behavior is unspecified and may result in an
exception. |
protected void processEvent(AWTEvent e) {
if (e instanceof ContainerEvent) {
processContainerEvent((ContainerEvent)e);
return;
}
super.processEvent(e);
}
Processes events on this container. If the event is a
ContainerEvent , it invokes the
processContainerEvent method, else it invokes
its superclass's processEvent .
Note that if the event parameter is null
the behavior is unspecified and may result in an
exception. |
void proxyEnableEvents(long events) {
if (peer instanceof LightweightPeer) {
// this container is lightweight.... continue sending it
// upward.
if (parent != null) {
parent.proxyEnableEvents(events);
}
} else {
// This is a native container, so it needs to host
// one of it's children. If this function is called before
// a peer has been created we don't yet have a dispatcher
// because it has not yet been determined if this instance
// is lightweight.
if (dispatcher != null) {
dispatcher.enableEvents(events);
}
}
}
This is called by lightweight components that want the containing
windowed parent to enable some kind of events on their behalf.
This is needed for events that are normally only dispatched to
windows to be accepted so that they can be forwarded downward to
the lightweight component that has enabled them. |
final void recursiveApplyCurrentShape() {
recursiveApplyCurrentShape(getTopmostComponentIndex(), getBottommostComponentIndex());
}
|
final void recursiveApplyCurrentShape(int fromZorder) {
recursiveApplyCurrentShape(fromZorder, getBottommostComponentIndex());
}
|
final void recursiveApplyCurrentShape(int fromZorder,
int toZorder) {
checkTreeLock();
if (mixingLog.isLoggable(PlatformLogger.FINE)) {
mixingLog.fine("this = " + this +
"; fromZ=" + fromZorder + "; toZ=" + toZorder);
}
if (fromZorder == -1) {
return;
}
// An invalid container with not-null layout should be ignored
// by the mixing code, the container will be validated later
// and the mixing code will be executed later.
if (getLayout() != null && !isValid()) {
return;
}
for (int index = fromZorder; index < = toZorder; index++) {
Component comp = getComponent(index);
if (!comp.isLightweight()) {
comp.applyCurrentShape();
}
if (comp instanceof Container &&
((Container)comp).hasHeavyweightDescendants()) {
((Container)comp).recursiveApplyCurrentShape();
}
}
}
|
final void recursiveSubtractAndApplyShape(Region shape) {
recursiveSubtractAndApplyShape(shape, getTopmostComponentIndex(), getBottommostComponentIndex());
}
|
final void recursiveSubtractAndApplyShape(Region shape,
int fromZorder) {
recursiveSubtractAndApplyShape(shape, fromZorder, getBottommostComponentIndex());
}
|
final void recursiveSubtractAndApplyShape(Region shape,
int fromZorder,
int toZorder) {
checkTreeLock();
if (mixingLog.isLoggable(PlatformLogger.FINE)) {
mixingLog.fine("this = " + this +
"; shape=" + shape + "; fromZ=" + fromZorder + "; toZ=" + toZorder);
}
if (fromZorder == -1) {
return;
}
if (shape.isEmpty()) {
return;
}
// An invalid container with not-null layout should be ignored
// by the mixing code, the container will be validated later
// and the mixing code will be executed later.
if (getLayout() != null && !isValid()) {
return;
}
for (int index = fromZorder; index < = toZorder; index++) {
Component comp = getComponent(index);
if (!comp.isLightweight()) {
comp.subtractAndApplyShape(shape);
} else if (comp instanceof Container &&
((Container)comp).hasHeavyweightDescendants() && comp.isShowing()) {
((Container)comp).recursiveSubtractAndApplyShape(shape);
}
}
}
|
public void remove(int index) {
synchronized (getTreeLock()) {
if (index < 0 || index >= component.size()) {
throw new ArrayIndexOutOfBoundsException(index);
}
Component comp = component.get(index);
if (peer != null) {
comp.removeNotify();
}
if (layoutMgr != null) {
layoutMgr.removeLayoutComponent(comp);
}
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
-comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK));
adjustListeningChildren(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK,
-comp.numListening(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK));
adjustDescendants(-(comp.countHierarchyMembers()));
comp.parent = null;
component.remove(index);
comp.setGraphicsConfiguration(null);
invalidateIfValid();
if (containerListener != null ||
(eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 ||
Toolkit.enabledOnToolkit(AWTEvent.CONTAINER_EVENT_MASK)) {
ContainerEvent e = new ContainerEvent(this,
ContainerEvent.COMPONENT_REMOVED,
comp);
dispatchEvent(e);
}
comp.createHierarchyEvents(HierarchyEvent.HIERARCHY_CHANGED, comp,
this, HierarchyEvent.PARENT_CHANGED,
Toolkit.enabledOnToolkit(AWTEvent.HIERARCHY_EVENT_MASK));
if (peer != null && layoutMgr == null && isVisible()) {
updateCursorImmediately();
}
}
}
Removes the component, specified by index ,
from this container.
This method also notifies the layout manager to remove the
component from this container's layout via the
removeLayoutComponent method.
This method changes layout-related information, and therefore,
invalidates the component hierarchy. If the container has already been
displayed, the hierarchy must be validated thereafter in order to
reflect the changes. |
public void remove(Component comp) {
synchronized (getTreeLock()) {
if (comp.parent == this) {
int index = component.indexOf(comp);
if (index >= 0) {
remove(index);
}
}
}
}
Removes the specified component from this container.
This method also notifies the layout manager to remove the
component from this container's layout via the
removeLayoutComponent method.
This method changes layout-related information, and therefore,
invalidates the component hierarchy. If the container has already been
displayed, the hierarchy must be validated thereafter in order to
reflect the changes. |
public void removeAll() {
synchronized (getTreeLock()) {
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
-listeningChildren);
adjustListeningChildren(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK,
-listeningBoundsChildren);
adjustDescendants(-descendantsCount);
while (!component.isEmpty()) {
Component comp = component.remove(component.size()-1);
if (peer != null) {
comp.removeNotify();
}
if (layoutMgr != null) {
layoutMgr.removeLayoutComponent(comp);
}
comp.parent = null;
comp.setGraphicsConfiguration(null);
if (containerListener != null ||
(eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 ||
Toolkit.enabledOnToolkit(AWTEvent.CONTAINER_EVENT_MASK)) {
ContainerEvent e = new ContainerEvent(this,
ContainerEvent.COMPONENT_REMOVED,
comp);
dispatchEvent(e);
}
comp.createHierarchyEvents(HierarchyEvent.HIERARCHY_CHANGED,
comp, this,
HierarchyEvent.PARENT_CHANGED,
Toolkit.enabledOnToolkit(AWTEvent.HIERARCHY_EVENT_MASK));
}
if (peer != null && layoutMgr == null && isVisible()) {
updateCursorImmediately();
}
invalidateIfValid();
}
}
Removes all the components from this container.
This method also notifies the layout manager to remove the
components from this container's layout via the
removeLayoutComponent method.
This method changes layout-related information, and therefore,
invalidates the component hierarchy. If the container has already been
displayed, the hierarchy must be validated thereafter in order to
reflect the changes. |
public synchronized void removeContainerListener(ContainerListener l) {
if (l == null) {
return;
}
containerListener = AWTEventMulticaster.remove(containerListener, l);
}
|
public void removeNotify() {
synchronized (getTreeLock()) {
// We shouldn't use iterator because of the Swing menu
// implementation specifics:
// the menu is being assigned as a child to JLayeredPane
// instead of particular component so always affect
// collection of component if menu is becoming shown or hidden.
for (int i = component.size()-1 ; i >= 0 ; i--) {
Component comp = component.get(i);
if (comp != null) {
// Fix for 6607170.
// We want to suppress focus change on disposal
// of the focused component. But because of focus
// is asynchronous, we should suppress focus change
// on every component in case it receives native focus
// in the process of disposal.
comp.setAutoFocusTransferOnDisposal(false);
comp.removeNotify();
comp.setAutoFocusTransferOnDisposal(true);
}
}
// If some of the children had focus before disposal then it still has.
// Auto-transfer focus to the next (or previous) component if auto-transfer
// is enabled.
if (containsFocus() && KeyboardFocusManager.isAutoFocusTransferEnabledFor(this)) {
if (!transferFocus(false)) {
transferFocusBackward(true);
}
}
if ( dispatcher != null ) {
dispatcher.dispose();
dispatcher = null;
}
super.removeNotify();
}
}
Makes this Container undisplayable by removing its connection
to its native screen resource. Making a container undisplayable
will cause all of its children to be made undisplayable.
This method is called by the toolkit internally and should
not be called directly by programs. |
public void setComponentZOrder(Component comp,
int index) {
synchronized (getTreeLock()) {
// Store parent because remove will clear it
Container curParent = comp.parent;
int oldZindex = getComponentZOrder(comp);
if (curParent == this && index == oldZindex) {
return;
}
checkAdding(comp, index);
boolean peerRecreated = (curParent != null) ?
curParent.removeDelicately(comp, this, index) : false;
addDelicately(comp, curParent, index);
// If the oldZindex == -1, the component gets inserted,
// rather than it changes its z-order.
if (!peerRecreated && oldZindex != -1) {
// The new 'index' cannot be == -1.
// It gets checked at the checkAdding() method.
// Therefore both oldZIndex and index denote
// some existing positions at this point and
// this is actually a Z-order changing.
comp.mixOnZOrderChanging(oldZindex, index);
}
}
}
Moves the specified component to the specified z-order index in
the container. The z-order determines the order that components
are painted; the component with the highest z-order paints first
and the component with the lowest z-order paints last.
Where components overlap, the component with the lower
z-order paints over the component with the higher z-order.
If the component is a child of some other container, it is
removed from that container before being added to this container.
The important difference between this method and
java.awt.Container.add(Component, int) is that this method
doesn't call removeNotify on the component while
removing it from its previous container unless necessary and when
allowed by the underlying native windowing system. This way, if the
component has the keyboard focus, it maintains the focus when
moved to the new position.
This property is guaranteed to apply only to lightweight
non-Container components.
This method changes layout-related information, and therefore,
invalidates the component hierarchy.
Note: Not all platforms support changing the z-order of
heavyweight components from one container into another without
the call to removeNotify . There is no way to detect
whether a platform supports this, so developers shouldn't make
any assumptions. |
public void setFocusCycleRoot(boolean focusCycleRoot) {
boolean oldFocusCycleRoot;
synchronized (this) {
oldFocusCycleRoot = this.focusCycleRoot;
this.focusCycleRoot = focusCycleRoot;
}
firePropertyChange("focusCycleRoot", oldFocusCycleRoot,
focusCycleRoot);
}
Sets whether this Container is the root of a focus traversal cycle. Once
focus enters a traversal cycle, typically it cannot leave it via focus
traversal unless one of the up- or down-cycle keys is pressed. Normal
traversal is limited to this Container, and all of this Container's
descendants that are not descendants of inferior focus cycle roots. Note
that a FocusTraversalPolicy may bend these restrictions, however. For
example, ContainerOrderFocusTraversalPolicy supports implicit down-cycle
traversal.
The alternative way to specify the traversal order of this Container's
children is to make this Container a
focus traversal policy provider. |
public void setFocusTraversalKeys(int id,
Set<AWTKeyStroke> keystrokes) {
if (id < 0 || id >= KeyboardFocusManager.TRAVERSAL_KEY_LENGTH) {
throw new IllegalArgumentException("invalid focus traversal key identifier");
}
// Don't call super.setFocusTraversalKey. The Component parameter check
// does not allow DOWN_CYCLE_TRAVERSAL_KEYS, but we do.
setFocusTraversalKeys_NoIDCheck(id, keystrokes);
}
Sets the focus traversal keys for a given traversal operation for this
Container.
The default values for a Container's focus traversal keys are
implementation-dependent. Sun recommends that all implementations for a
particular native platform use the same default values. The
recommendations for Windows and Unix are listed below. These
recommendations are used in the Sun AWT implementations.
Identifier |
Meaning |
Default |
KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS |
Normal forward keyboard traversal |
TAB on KEY_PRESSED, CTRL-TAB on KEY_PRESSED |
KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS |
Normal reverse keyboard traversal |
SHIFT-TAB on KEY_PRESSED, CTRL-SHIFT-TAB on KEY_PRESSED |
KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS |
Go up one focus traversal cycle |
none |
KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS |
| Go down one focus traversal cycle |
none |
To disable a traversal key, use an empty Set; Collections.EMPTY_SET is
recommended.
Using the AWTKeyStroke API, client code can specify on which of two
specific KeyEvents, KEY_PRESSED or KEY_RELEASED, the focus traversal
operation will occur. Regardless of which KeyEvent is specified,
however, all KeyEvents related to the focus traversal key, including the
associated KEY_TYPED event, will be consumed, and will not be dispatched
to any Container. It is a runtime error to specify a KEY_TYPED event as
mapping to a focus traversal operation, or to map the same event to
multiple default focus traversal operations.
If a value of null is specified for the Set, this Container inherits the
Set from its parent. If all ancestors of this Container have null
specified for the Set, then the current KeyboardFocusManager's default
Set is used. |
public void setFocusTraversalPolicy(FocusTraversalPolicy policy) {
FocusTraversalPolicy oldPolicy;
synchronized (this) {
oldPolicy = this.focusTraversalPolicy;
this.focusTraversalPolicy = policy;
}
firePropertyChange("focusTraversalPolicy", oldPolicy, policy);
}
Sets the focus traversal policy that will manage keyboard traversal of
this Container's children, if this Container is a focus cycle root. If
the argument is null, this Container inherits its policy from its focus-
cycle-root ancestor. If the argument is non-null, this policy will be
inherited by all focus-cycle-root children that have no keyboard-
traversal policy of their own (as will, recursively, their focus-cycle-
root children).
If this Container is not a focus cycle root, the policy will be
remembered, but will not be used or inherited by this or any other
Containers until this Container is made a focus cycle root. |
public final void setFocusTraversalPolicyProvider(boolean provider) {
boolean oldProvider;
synchronized(this) {
oldProvider = focusTraversalPolicyProvider;
focusTraversalPolicyProvider = provider;
}
firePropertyChange("focusTraversalPolicyProvider", oldProvider, provider);
}
Sets whether this container will be used to provide focus
traversal policy. Container with this property as
true will be used to acquire focus traversal policy
instead of closest focus cycle root ancestor. |
public void setFont(Font f) {
boolean shouldinvalidate = false;
Font oldfont = getFont();
super.setFont(f);
Font newfont = getFont();
if (newfont != oldfont && (oldfont == null ||
!oldfont.equals(newfont))) {
invalidateTree();
}
}
Sets the font of this container.
This method changes layout-related information, and therefore,
invalidates the component hierarchy. |
public void setLayout(LayoutManager mgr) {
layoutMgr = mgr;
invalidateIfValid();
}
Sets the layout manager for this container.
This method changes layout-related information, and therefore,
invalidates the component hierarchy. |
public void transferFocusDownCycle() {
if (isFocusCycleRoot()) {
KeyboardFocusManager.getCurrentKeyboardFocusManager().
setGlobalCurrentFocusCycleRoot(this);
Component toFocus = getFocusTraversalPolicy().
getDefaultComponent(this);
if (toFocus != null) {
toFocus.requestFocus(CausedFocusEvent.Cause.TRAVERSAL_DOWN);
}
}
}
Transfers the focus down one focus traversal cycle. If this Container is
a focus cycle root, then the focus owner is set to this Container's
default Component to focus, and the current focus cycle root is set to
this Container. If this Container is not a focus cycle root, then no
focus traversal operation occurs. |
public void update(Graphics g) {
if (isShowing()) {
if (! (peer instanceof LightweightPeer)) {
g.clearRect(0, 0, width, height);
}
paint(g);
}
}
Updates the container. This forwards the update to any lightweight
components that are children of this container. If this method is
reimplemented, super.update(g) should be called so that lightweight
components are properly rendered. If a child component is entirely
clipped by the current clipping setting in g, update() will not be
forwarded to that child. |
boolean updateGraphicsData(GraphicsConfiguration gc) {
checkTreeLock();
boolean ret = super.updateGraphicsData(gc);
for (Component comp : component) {
if (comp != null) {
ret |= comp.updateGraphicsData(gc);
}
}
return ret;
}
|
public void validate() {
boolean updateCur = false;
synchronized (getTreeLock()) {
if ((!isValid() || descendUnconditionallyWhenValidating)
&& peer != null)
{
ContainerPeer p = null;
if (peer instanceof ContainerPeer) {
p = (ContainerPeer) peer;
}
if (p != null) {
p.beginValidate();
}
validateTree();
if (p != null) {
p.endValidate();
// Avoid updating cursor if this is an internal call.
// See validateUnconditionally() for details.
if (!descendUnconditionallyWhenValidating) {
updateCur = isVisible();
}
}
}
}
if (updateCur) {
updateCursorImmediately();
}
}
Validates this container and all of its subcomponents.
Validating a container means laying out its subcomponents.
Layout-related changes, such as setting the bounds of a component, or
adding a component to the container, invalidate the container
automatically. Note that the ancestors of the container may be
invalidated also (see Component#invalidate for details.)
Therefore, to restore the validity of the hierarchy, the {@code
validate()} method should be invoked on the top-most invalid
container of the hierarchy.
Validating the container may be a quite time-consuming operation. For
performance reasons a developer may postpone the validation of the
hierarchy till a set of layout-related operations completes, e.g. after
adding all the children to the container.
If this {@code Container} is not valid, this method invokes
the {@code validateTree} method and marks this {@code Container}
as valid. Otherwise, no action is performed. |
protected void validateTree() {
checkTreeLock();
if (!isValid() || descendUnconditionallyWhenValidating) {
if (peer instanceof ContainerPeer) {
((ContainerPeer)peer).beginLayout();
}
if (!isValid()) {
doLayout();
}
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if ( (comp instanceof Container)
&& !(comp instanceof Window)
&& (!comp.isValid() ||
descendUnconditionallyWhenValidating))
{
((Container)comp).validateTree();
} else {
comp.validate();
}
}
if (peer instanceof ContainerPeer) {
((ContainerPeer)peer).endLayout();
}
}
super.validate();
}
Recursively descends the container tree and recomputes the
layout for any subtrees marked as needing it (those marked as
invalid). Synchronization should be provided by the method
that calls this one: validate . |
final void validateUnconditionally() {
boolean updateCur = false;
synchronized (getTreeLock()) {
descendUnconditionallyWhenValidating = true;
validate();
if (peer instanceof ContainerPeer) {
updateCur = isVisible();
}
descendUnconditionallyWhenValidating = false;
}
if (updateCur) {
updateCursorImmediately();
}
}
Unconditionally validate the component hierarchy. |