<AWT Dev> [9] Review request for 8133453 Remove AWTKeyStroke.registerSubclass(Class) method
Sergey Bylokhov
Sergey.Bylokhov at oracle.com
Tue Sep 1 13:39:02 UTC 2015
Looks fine to me.
On 01.09.15 13:49, Alexander Scherbatiy wrote:
>
> Hello,
>
> Could you review the fix:
> bug: https://bugs.openjdk.java.net/browse/JDK-8133453
> webrev: http://cr.openjdk.java.net/~alexsch/8133453/webrev.00
>
> The class KeyStroke has been added to the javax.swing package first
> and then copied to the java.awt.AWTKeyStroke class.
> Most of KeyStroke class methods looks like registering KeyStroke
> class and call to the parent AWTKeyStroke method.
>
> AWTKeyStroke class is intended to contain keyChar, keyCode,
> modifiers, and keyRelease flag and it seems
> there are no reasons that this class can be subclassed.
>
> The suggestion is to remove the AWTKeyStroke.registerSubclass(Class)
> method.
>
> The AWTKeyStroke.registerSubclass(Class) method can be deprecated so
> only AWTKeyStroke and KeyStroke instances is allowed to be created.
> The result will be that a user code get ClassCastException when
> casting a returned key stroke to the custom key stroke which has the
> similar effect.
>
> Removing the method in question leads to the binary compatibility
> issue if someone uses the method. The following code will not work:
> --------------------------
> public class CustomKeyStroke extends AWTKeyStroke {
>
> public static void registerCustomKeyStroke() {
> AWTKeyStroke.registerSubclass(CustomKeyStroke.class); //
> removed method
> }
> }
>
> CustomKeyStroke.registerCustomKeyStroke();
> AWTKeyStroke keyStroke = AWTKeyStroke.getAWTKeyStroke('C');
> CustomKeyStroke customKeyStroke = (CustomKeyStroke) keyStroke; //
> CustomKeyStroke instance is not returned
> --------------------------
>
> The proposed workaround is to use a map between unique AWTKeyStroke
> instances and custom key strokes:
> --------------------------
> private static HashMap<AWTKeyStroke, CustomKeyStroke> keyStrokeMap
> = new HashMap<>();
>
> public static CustomKeyStroke getCustomKeyStroke(char c) {
> AWTKeyStroke ketStroke = AWTKeyStroke.getAWTKeyStroke(c);
> CustomKeyStroke customKeyStroke = keyStrokeMap.get(ketStroke);
>
> if (customKeyStroke == null) {
> customKeyStroke = new CustomKeyStroke(ketStroke);
> keyStrokeMap.put(ketStroke, customKeyStroke);
> }
>
> return customKeyStroke;
> }
> --------------------------
>
>
> AWT/Swing library only registers KeyStroke class
> (AWTKeyStroke.registerSubclass(KeyStroke.class) calls in the KeyStroke
> class)
> and never registers AWTKeyStroke.class.
> After the first KeyStroke.getKeyStroke(...) call in the keyStroke
> class only KeyStroke instances will be created by AWTKeyStroke.
>
> The solution proposed in the fix is to always create
> javax.swing.KeyStroke instances.
>
> Thanks,
> Alexandr.
>
--
Best regards, Sergey.
More information about the awt-dev
mailing list