/* * Copyright (c) 1997, 2009, 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. *
* 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. *
* KeyStrokes are immutable, and are intended to be unique. Client code cannot
* create a KeyStroke; a variant of getKeyStroke
must be used
* instead. These factory methods allow the KeyStroke implementation to cache
* and share instances efficiently.
*
* Warning:
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is
* appropriate for short term storage or RMI between applications running
* the same version of Swing. As of 1.4, support for long term storage
* of all JavaBeansTM
* has been added to the java.beans
package.
* Please see {@link java.beans.XMLEncoder}.
*
* @see 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 KeyStroke
* that represents a KEY_TYPED
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 true
if this KeyStroke corresponds to a
* key release; false
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
* getKeyStroke(int keyCode, int modifiers)
.
*
* The modifiers consist of any combination of following:
* The "virtual key" constants defined in java.awt.event.KeyEvent can be * used to specify the key code. For example:
java.awt.event.KeyEvent.getExtendedKeyCodeForChar
.
*
* The modifiers consist of any combination of:true
if the KeyStroke should represent
* a key release; false
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.
* * The "virtual key" constants defined in java.awt.event.KeyEvent can be * used to specify the key code. For example:
java.awt.event.KeyEvent.getExtendedKeyCodeForChar
.
*
* The modifiers consist of any combination of:
* 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 anEvent
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 KeyStroke
.
* The string must have the following syntax:
*
* <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_". ** If typed, pressed or released is not specified, pressed is assumed. Here * are some examples: *
* "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'); ** * 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; } } } }