< prev index next >
src/java.desktop/share/classes/java/awt/event/FocusEvent.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 23,44 ****
* questions.
*/
package java.awt.event;
- import java.awt.Component;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
/**
* A low-level event which indicates that a Component has gained or lost the
* input focus. This low-level event is generated by a Component (such as a
! * TextField). The event is passed to every <code>FocusListener</code> or
! * <code>FocusAdapter</code> object which registered to receive such events
! * using the Component's <code>addFocusListener</code> method. (<code>
! * FocusAdapter</code> objects implement the <code>FocusListener</code>
! * interface.) Each such listener object gets this <code>FocusEvent</code> when
* the event occurs.
* <p>
* There are two levels of focus events: permanent and temporary. Permanent
* focus change events occur when focus is directly moved from one Component to
* another, such as through a call to requestFocus() or as the user uses the
--- 23,45 ----
* questions.
*/
package java.awt.event;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
+ import java.awt.*;
+
/**
* A low-level event which indicates that a Component has gained or lost the
* input focus. This low-level event is generated by a Component (such as a
! * TextField). The event is passed to every {@code FocusListener} or
! * {@code FocusAdapter} object which registered to receive such events
! * using the Component's {@code addFocusListener} method. ({@code
! * FocusAdapter} objects implement the {@code FocusListener}
! * interface.) Each such listener object gets this {@code FocusEvent} when
* the event occurs.
* <p>
* There are two levels of focus events: permanent and temporary. Permanent
* focus change events occur when focus is directly moved from one Component to
* another, such as through a call to requestFocus() or as the user uses the
*** 49,58 ****
--- 50,63 ----
* is finished, or, for the case of Window deactivation, when the Window is
* reactivated. Both permanent and temporary focus events are delivered using
* the FOCUS_GAINED and FOCUS_LOST event ids; the level may be distinguished in
* the event using the isTemporary() method.
* <p>
+ * Every {@code FocusEvent} records its cause - the reason why this event was
+ * generated. The cause is assigned during the focus event creation and may be
+ * retrieved by calling {@link #getCause}.
+ * <p>
* An unspecified behavior will be caused if the {@code id} parameter
* of any particular {@code FocusEvent} instance is not
* in the range from {@code FOCUS_FIRST} to {@code FOCUS_LAST}.
*
* @see FocusAdapter
*** 64,73 ****
--- 69,133 ----
* @since 1.1
*/
public class FocusEvent extends ComponentEvent {
/**
+ * This enum represents the cause of a {@code FocusEvent}- the reason why it
+ * occurred. Possible reasons include mouse events, keyboard focus
+ * traversal, window activation.
+ * If no cause is provided then the reason is {@code UNKNOWN}.
+ *
+ * @since 1.9
+ */
+ public enum Cause {
+ /**
+ * The default value.
+ */
+ UNKNOWN,
+ /**
+ * An activating mouse event.
+ */
+ MOUSE_EVENT,
+ /**
+ * A focus traversal action with unspecified direction.
+ */
+ TRAVERSAL,
+ /**
+ * An up-cycle focus traversal action.
+ */
+ TRAVERSAL_UP,
+ /**
+ * A down-cycle focus traversal action.
+ */
+ TRAVERSAL_DOWN,
+ /**
+ * A forward focus traversal action.
+ */
+ TRAVERSAL_FORWARD,
+ /**
+ * A backward focus traversal action.
+ */
+ TRAVERSAL_BACKWARD,
+ /**
+ * Restoring focus after a focus request has been rejected.
+ */
+ ROLLBACK,
+ /**
+ * A system action causing an unexpected focus change.
+ */
+ UNEXPECTED,
+ /**
+ * An activation of a toplevel window.
+ */
+ ACTIVATION,
+ /**
+ * Clearing global focus owner.
+ */
+ CLEAR_GLOBAL_FOCUS_OWNER
+ }
+
+ /**
* The first number in the range of ids used for focus events.
*/
public static final int FOCUS_FIRST = 1004;
/**
*** 83,92 ****
--- 143,154 ----
/**
* This event indicates that the Component is no longer the focus owner.
*/
public static final int FOCUS_LOST = 1 + FOCUS_FIRST; //Event.LOST_FOCUS
+ private final Cause cause;
+
/**
* A focus event can have two different levels, permanent and temporary.
* It will be set to true if some operation takes away the focus
* temporarily and intends on getting it back once the event is completed.
* Otherwise it will be set to false.
*** 109,204 ****
transient Component opposite;
/*
* JDK 1.1 serialVersionUID
*/
! private static final long serialVersionUID = 523753786457416396L;
/**
! * Constructs a <code>FocusEvent</code> object with the
! * specified temporary state and opposite <code>Component</code>.
! * The opposite <code>Component</code> is the other
! * <code>Component</code> involved in this focus change.
! * For a <code>FOCUS_GAINED</code> event, this is the
! * <code>Component</code> that lost focus. For a
! * <code>FOCUS_LOST</code> event, this is the <code>Component</code>
* that gained focus. If this focus change occurs with a native
* application, with a Java application in a different VM,
! * or with no other <code>Component</code>, then the opposite
! * <code>Component</code> is <code>null</code>.
* <p> This method throws an
! * <code>IllegalArgumentException</code> if <code>source</code>
! * is <code>null</code>.
*
! * @param source The <code>Component</code> that originated the event
* @param id An integer indicating the type of event.
* For information on allowable values, see
* the class description for {@link FocusEvent}
! * @param temporary Equals <code>true</code> if the focus change is temporary;
! * <code>false</code> otherwise
* @param opposite The other Component involved in the focus change,
! * or <code>null</code>
! * @throws IllegalArgumentException if <code>source</code> equals {@code null}
* @see #getSource()
* @see #getID()
* @see #isTemporary()
* @see #getOppositeComponent()
* @since 1.4
*/
public FocusEvent(Component source, int id, boolean temporary,
Component opposite) {
super(source, id);
this.temporary = temporary;
this.opposite = opposite;
}
/**
! * Constructs a <code>FocusEvent</code> object and identifies
* whether or not the change is temporary.
* <p> This method throws an
! * <code>IllegalArgumentException</code> if <code>source</code>
! * is <code>null</code>.
*
! * @param source The <code>Component</code> that originated the event
* @param id An integer indicating the type of event.
* For information on allowable values, see
* the class description for {@link FocusEvent}
! * @param temporary Equals <code>true</code> if the focus change is temporary;
! * <code>false</code> otherwise
! * @throws IllegalArgumentException if <code>source</code> equals {@code null}
* @see #getSource()
* @see #getID()
* @see #isTemporary()
*/
public FocusEvent(Component source, int id, boolean temporary) {
this(source, id, temporary, null);
}
/**
! * Constructs a <code>FocusEvent</code> object and identifies it
* as a permanent change in focus.
* <p> This method throws an
! * <code>IllegalArgumentException</code> if <code>source</code>
! * is <code>null</code>.
*
! * @param source The <code>Component</code> that originated the event
* @param id An integer indicating the type of event.
* For information on allowable values, see
* the class description for {@link FocusEvent}
! * @throws IllegalArgumentException if <code>source</code> equals {@code null}
* @see #getSource()
* @see #getID()
*/
public FocusEvent(Component source, int id) {
this(source, id, false);
}
/**
* Identifies the focus change event as temporary or permanent.
*
! * @return <code>true</code> if the focus change is temporary;
! * <code>false</code> otherwise
*/
public boolean isTemporary() {
return temporary;
}
--- 171,308 ----
transient Component opposite;
/*
* JDK 1.1 serialVersionUID
*/
! private static final long serialVersionUID = 523753786457416397L;
/**
! * Constructs a {@code FocusEvent} object with the
! * specified temporary state and opposite {@code Component} and the
! * {@code Cause.UNKNOWN} cause.
! * The opposite {@code Component} is the other
! * {@code Component} involved in this focus change.
! * For a {@code FOCUS_GAINED} event, this is the
! * {@code Component} that lost focus. For a
! * {@code FOCUS_LOST} event, this is the {@code Component}
* that gained focus. If this focus change occurs with a native
* application, with a Java application in a different VM,
! * or with no other {@code Component}, then the opposite
! * {@code Component} is {@code null}.
* <p> This method throws an
! * {@code IllegalArgumentException} if {@code source}
! * is {@code null}.
*
! * @param source The {@code Component} that originated the event
* @param id An integer indicating the type of event.
* For information on allowable values, see
* the class description for {@link FocusEvent}
! * @param temporary Equals {@code true} if the focus change is temporary;
! * {@code false} otherwise
* @param opposite The other Component involved in the focus change,
! * or {@code null}
! * @throws IllegalArgumentException if {@code source} equals {@code null}
* @see #getSource()
* @see #getID()
* @see #isTemporary()
* @see #getOppositeComponent()
+ * @see Cause#UNKNOWN
* @since 1.4
*/
public FocusEvent(Component source, int id, boolean temporary,
Component opposite) {
+ this(source, id, temporary, opposite, Cause.UNKNOWN);
+ }
+
+ /**
+ * Constructs a {@code FocusEvent} object with the
+ * specified temporary state, opposite {@code Component} and the cause.
+ * The opposite {@code Component} is the other
+ * {@code Component} involved in this focus change.
+ * For a {@code FOCUS_GAINED} event, this is the
+ * {@code Component} that lost focus. For a
+ * {@code FOCUS_LOST} event, this is the {@code Component}
+ * that gained focus. If this focus change occurs with a native
+ * application, with a Java application in a different VM,
+ * or with no other {@code Component}, then the opposite
+ * {@code Component} is {@code null}.
+ * <p> This method throws an
+ * {@code IllegalArgumentException} if {@code source}
+ * is {@code null}.
+ *
+ * @param source The {@code Component} that originated the event
+ * @param id An integer indicating the type of event.
+ * For information on allowable values, see
+ * the class description for {@link FocusEvent}
+ * @param temporary Equals {@code true} if the focus change is temporary;
+ * {@code false} otherwise
+ * @param opposite The other Component involved in the focus change,
+ * or {@code null}
+ * @param cause The focus event cause.
+ * @throws IllegalArgumentException if {@code source} equals {@code null}
+ * or if {@code cause} equals {@code null}
+ * @see #getSource()
+ * @see #getID()
+ * @see #isTemporary()
+ * @see #getOppositeComponent()
+ * @see Cause
+ * @since 1.9
+ */
+ public FocusEvent(Component source, int id, boolean temporary,
+ Component opposite, Cause cause) {
super(source, id);
this.temporary = temporary;
this.opposite = opposite;
+ this.cause = cause;
}
/**
! * Constructs a {@code FocusEvent} object and identifies
* whether or not the change is temporary.
* <p> This method throws an
! * {@code IllegalArgumentException} if {@code source}
! * is {@code null}.
*
! * @param source The {@code Component} that originated the event
* @param id An integer indicating the type of event.
* For information on allowable values, see
* the class description for {@link FocusEvent}
! * @param temporary Equals {@code true} if the focus change is temporary;
! * {@code false} otherwise
! * @throws IllegalArgumentException if {@code source} equals {@code null}
* @see #getSource()
* @see #getID()
* @see #isTemporary()
*/
public FocusEvent(Component source, int id, boolean temporary) {
this(source, id, temporary, null);
}
/**
! * Constructs a {@code FocusEvent} object and identifies it
* as a permanent change in focus.
* <p> This method throws an
! * {@code IllegalArgumentException} if {@code source}
! * is {@code null}.
*
! * @param source The {@code Component} that originated the event
* @param id An integer indicating the type of event.
* For information on allowable values, see
* the class description for {@link FocusEvent}
! * @throws IllegalArgumentException if {@code source} equals {@code null}
* @see #getSource()
* @see #getID()
*/
public FocusEvent(Component source, int id) {
this(source, id, false);
}
/**
* Identifies the focus change event as temporary or permanent.
*
! * @return {@code true} if the focus change is temporary;
! * {@code false} otherwise
*/
public boolean isTemporary() {
return temporary;
}
*** 241,249 ****
break;
default:
typeStr = "unknown type";
}
return typeStr + (temporary ? ",temporary" : ",permanent") +
! ",opposite=" + getOppositeComponent();
}
}
--- 345,362 ----
break;
default:
typeStr = "unknown type";
}
return typeStr + (temporary ? ",temporary" : ",permanent") +
! ",opposite=" + getOppositeComponent() + ",cause=" + getCause();
}
+ /**
+ * Returns the event cause.
+ *
+ * @return one of {@link Cause} values
+ * @since 1.9
+ */
+ public final Cause getCause() {
+ return cause;
+ }
}
< prev index next >