/* |
|
* Copyright (c) 1997, 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 |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
package javax.swing; |
|
import java.awt.AWTKeyStroke; |
|
import java.awt.event.KeyEvent; |
|
/** |
|
* A KeyStroke represents a key action on the keyboard, or equivalent input |
|
* device. KeyStrokes can correspond to only a press or release of a particular |
|
* key, just as KEY_PRESSED and KEY_RELEASED KeyEvents do; alternately, they |
|
* can correspond to typing a specific Java character, just as KEY_TYPED |
|
* KeyEvents do. In all cases, KeyStrokes can specify modifiers (alt, shift, |
|
* control, meta, altGraph, or a combination thereof) which must be present during the |
|
* action for an exact match. |
|
* <p> |
|
* KeyStrokes are used to define high-level (semantic) action events. Instead |
|
* of trapping every keystroke and throwing away the ones you are not |
|
* interested in, those keystrokes you care about automatically initiate |
|
* actions on the Components with which they are registered. |
|
* <p> |
|
* KeyStrokes are immutable, and are intended to be unique. Client code cannot |
|
* create a KeyStroke; a variant of <code>getKeyStroke</code> must be used |
|
* instead. These factory methods allow the KeyStroke implementation to cache |
|
* and share instances efficiently. |
|
* <p> |
|
* <strong>Warning:</strong> |
|
* 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 JavaBeans™ |
|
* has been added to the <code>java.beans</code> package. |
|
* Please see {@link java.beans.XMLEncoder}. |
|
* |
|
* @see javax.swing.text.Keymap |
|
* @see #getKeyStroke |
|
* |
|
* @author Arnaud Weber |
|
* @author David Mendenhall |
|
*/ |
|
public class KeyStroke extends AWTKeyStroke { |
|
/** |
|
* Serial Version ID. |
|
*/ |
|
private static final long serialVersionUID = -9060180771037902530L; |
|
private KeyStroke() { |
|
} |
|
private KeyStroke(char keyChar, int keyCode, int modifiers, |
|
boolean onKeyRelease) { |
|
super(keyChar, keyCode, modifiers, onKeyRelease); |
|
} |
|
/** |
|
* Returns a shared instance of a <code>KeyStroke</code> |
|
* that represents a <code>KEY_TYPED</code> event for the |
|
* specified character. |
|
* |
|
* @param keyChar the character value for a keyboard key |
|
* @return a KeyStroke object for that key |
|
*/ |
|
public static KeyStroke getKeyStroke(char keyChar) { |
|
synchronized (AWTKeyStroke.class) { |
|
registerSubclass(KeyStroke.class); |
|
return (KeyStroke)getAWTKeyStroke(keyChar); |
|
} |
|
} |
|
/** |
|
* Returns an instance of a KeyStroke, specifying whether the key is |
|
* considered to be activated when it is pressed or released. Unlike all |
|
* other factory methods in this class, the instances returned by this |
|
* method are not necessarily cached or shared. |
|
* |
|
* @param keyChar the character value for a keyboard key |
|
* @param onKeyRelease <code>true</code> if this KeyStroke corresponds to a |
|
* key release; <code>false</code> otherwise. |
|
* @return a KeyStroke object for that key |
|
* @deprecated use getKeyStroke(char) |
|
*/ |
|
@Deprecated |
|
public static KeyStroke getKeyStroke(char keyChar, boolean onKeyRelease) { |
|
return new KeyStroke(keyChar, KeyEvent.VK_UNDEFINED, 0, onKeyRelease); |
|
} |
|
/** |
|
* Returns a shared instance of a {@code KeyStroke} |
|
* that represents a {@code KEY_TYPED} event for the |
|
* specified Character object and a |
|
* set of modifiers. Note that the first parameter is of type Character |
|
* rather than char. This is to avoid inadvertent clashes with calls to |
|
* <code>getKeyStroke(int keyCode, int modifiers)</code>. |
|
* |
|
* The modifiers consist of any combination of following:<ul> |
|
* <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.CTRL_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.META_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.ALT_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.ALT_GRAPH_DOWN_MASK |
|
* </ul> |
|
* The old modifiers listed below also can be used, but they are |
|
* mapped to _DOWN_ modifiers. <ul> |
|
* <li>java.awt.event.InputEvent.SHIFT_MASK |
|
* <li>java.awt.event.InputEvent.CTRL_MASK |
|
* <li>java.awt.event.InputEvent.META_MASK |
|
* <li>java.awt.event.InputEvent.ALT_MASK |
|
* <li>java.awt.event.InputEvent.ALT_GRAPH_MASK |
|
* </ul> |
|
* also can be used, but they are mapped to _DOWN_ modifiers. |
|
* |
|
* Since these numbers are all different powers of two, any combination of |
|
* them is an integer in which each bit represents a different modifier |
|
* key. Use 0 to specify no modifiers. |
|
* |
|
* @param keyChar the Character object for a keyboard character |
|
* @param modifiers a bitwise-ored combination of any modifiers |
|
* @return an KeyStroke object for that key |
|
* @throws IllegalArgumentException if keyChar is null |
|
* |
|
* @see java.awt.event.InputEvent |
|
* @since 1.3 |
|
*/ |
|
public static KeyStroke getKeyStroke(Character keyChar, int modifiers) { |
|
synchronized (AWTKeyStroke.class) { |
|
registerSubclass(KeyStroke.class); |
|
return (KeyStroke)getAWTKeyStroke(keyChar, modifiers); |
|
} |
|
} |
|
/** |
|
* Returns a shared instance of a KeyStroke, given a numeric key code and a |
|
* set of modifiers, specifying whether the key is activated when it is |
|
* pressed or released. |
|
* <p> |
|
* The "virtual key" constants defined in java.awt.event.KeyEvent can be |
|
* used to specify the key code. For example:<ul> |
|
* <li>java.awt.event.KeyEvent.VK_ENTER |
|
* <li>java.awt.event.KeyEvent.VK_TAB |
|
* <li>java.awt.event.KeyEvent.VK_SPACE |
|
* </ul> |
|
* Alternatively, the key code may be obtained by calling |
|
* <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>. |
|
* |
|
* The modifiers consist of any combination of:<ul> |
|
* <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.CTRL_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.META_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.ALT_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.ALT_GRAPH_DOWN_MASK |
|
* </ul> |
|
* The old modifiers <ul> |
|
* <li>java.awt.event.InputEvent.SHIFT_MASK |
|
* <li>java.awt.event.InputEvent.CTRL_MASK |
|
* <li>java.awt.event.InputEvent.META_MASK |
|
* <li>java.awt.event.InputEvent.ALT_MASK |
|
* <li>java.awt.event.InputEvent.ALT_GRAPH_MASK |
|
* </ul> |
|
* also can be used, but they are mapped to _DOWN_ modifiers. |
|
* |
|
* Since these numbers are all different powers of two, any combination of |
|
* them is an integer in which each bit represents a different modifier |
|
* key. Use 0 to specify no modifiers. |
|
* |
|
* @param keyCode an int specifying the numeric code for a keyboard key |
|
* @param modifiers a bitwise-ored combination of any modifiers |
|
* @param onKeyRelease <code>true</code> if the KeyStroke should represent |
|
* a key release; <code>false</code> otherwise. |
|
* @return a KeyStroke object for that key |
|
* |
|
* @see java.awt.event.KeyEvent |
|
* @see java.awt.event.InputEvent |
|
*/ |
|
public static KeyStroke getKeyStroke(int keyCode, int modifiers, |
|
boolean onKeyRelease) { |
|
synchronized (AWTKeyStroke.class) { |
|
registerSubclass(KeyStroke.class); |
|
return (KeyStroke)getAWTKeyStroke(keyCode, modifiers, |
|
onKeyRelease); |
|
} |
|
} |
|
/** |
|
* Returns a shared instance of a KeyStroke, given a numeric key code and a |
|
* set of modifiers. The returned KeyStroke will correspond to a key press. |
|
* <p> |
|
* The "virtual key" constants defined in java.awt.event.KeyEvent can be |
|
* used to specify the key code. For example:<ul> |
|
* <li>java.awt.event.KeyEvent.VK_ENTER |
|
* <li>java.awt.event.KeyEvent.VK_TAB |
|
* <li>java.awt.event.KeyEvent.VK_SPACE |
|
* </ul> |
|
* Alternatively, the key code may be obtained by calling |
|
* <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>. |
|
* |
|
* The modifiers consist of any combination of:<ul> |
|
* <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.CTRL_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.META_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.ALT_DOWN_MASK |
|
* <li>java.awt.event.InputEvent.ALT_GRAPH_DOWN_MASK |
|
* </ul> |
|
* The old modifiers <ul> |
|
* <li>java.awt.event.InputEvent.SHIFT_MASK |
|
* <li>java.awt.event.InputEvent.CTRL_MASK |
|
* <li>java.awt.event.InputEvent.META_MASK |
|
* <li>java.awt.event.InputEvent.ALT_MASK |
|
* <li>java.awt.event.InputEvent.ALT_GRAPH_MASK |
|
* </ul> |
|
* also can be used, but they are mapped to _DOWN_ modifiers. |
|
* |
|
* Since these numbers are all different powers of two, any combination of |
|
* them is an integer in which each bit represents a different modifier |
|
* key. Use 0 to specify no modifiers. |
|
* |
|
* @param keyCode an int specifying the numeric code for a keyboard key |
|
* @param modifiers a bitwise-ored combination of any modifiers |
|
* @return a KeyStroke object for that key |
|
* |
|
* @see java.awt.event.KeyEvent |
|
* @see java.awt.event.InputEvent |
|
*/ |
|
public static KeyStroke getKeyStroke(int keyCode, int modifiers) { |
|
synchronized (AWTKeyStroke.class) { |
|
registerSubclass(KeyStroke.class); |
|
return (KeyStroke)getAWTKeyStroke(keyCode, modifiers); |
|
} |
|
} |
|
/** |
|
* Returns a KeyStroke which represents the stroke which generated a given |
|
* KeyEvent. |
|
* <p> |
|
* This method obtains the keyChar from a KeyTyped event, and the keyCode |
|
* from a KeyPressed or KeyReleased event. The KeyEvent modifiers are |
|
* obtained for all three types of KeyEvent. |
|
* |
|
* @param anEvent the KeyEvent from which to obtain the KeyStroke |
|
* @throws NullPointerException if <code>anEvent</code> is null |
|
* @return the KeyStroke that precipitated the event |
|
*/ |
|
public static KeyStroke getKeyStrokeForEvent(KeyEvent anEvent) { |
|
synchronized (AWTKeyStroke.class) { |
|
registerSubclass(KeyStroke.class); |
|
return (KeyStroke)getAWTKeyStrokeForEvent(anEvent); |
|
} |
|
} |
|
/** |
|
* Parses a string and returns a <code>KeyStroke</code>. |
|
* The string must have the following syntax: |
|
* <pre> |
|
* <modifiers>* (<typedID> | <pressedReleasedID>) |
|
* |
|
* modifiers := shift | control | ctrl | meta | alt | altGraph |
|
* typedID := typed <typedKey> |
|
* typedKey := string of length 1 giving Unicode character. |
|
* pressedReleasedID := (pressed | released) key |
|
* key := KeyEvent key code name, i.e. the name following "VK_". |
|
* </pre> |
|
* If typed, pressed or released is not specified, pressed is assumed. Here |
|
* are some examples: |
|
* <pre> |
|
* "INSERT" => getKeyStroke(KeyEvent.VK_INSERT, 0); |
|
* "control DELETE" => getKeyStroke(KeyEvent.VK_DELETE, InputEvent.CTRL_MASK); |
|
* "alt shift X" => getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK); |
|
* "alt shift released X" => getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK, true); |
|
* "typed a" => getKeyStroke('a'); |
|
* </pre> |
|
* |
|
* In order to maintain backward-compatibility, specifying a null String, |
|
* or a String which is formatted incorrectly, returns null. |
|
* |
|
* @param s a String formatted as described above |
|
* @return a KeyStroke object for that String, or null if the specified |
|
* String is null, or is formatted incorrectly |
|
* |
|
* @see java.awt.event.KeyEvent |
|
*/ |
|
public static KeyStroke getKeyStroke(String s) { |
|
if (s == null || s.length() == 0) { |
|
return null; |
|
} |
|
synchronized (AWTKeyStroke.class) { |
|
registerSubclass(KeyStroke.class); |
|
try { |
|
return (KeyStroke)getAWTKeyStroke(s); |
|
} catch (IllegalArgumentException e) { |
|
return null; |
|
} |
|
} |
|
} |
|
} |