getKeyStroke(char)与getKeyStroke(char,int) - 我不明白其中的区别

时间:2015-10-25 18:26:55

标签: java parameters keystroke

此代码始终返回0:

KeyStroke.getKeyStroke(someString.charAt(0)).getKeyCode();

虽然这个返回实际的密钥代码:

KeyStroke.getKeyStroke(someString.charAt(0), 0).getKeyCode();

但是,我不明白getKeyStroke()中的第二个参数是什么有用。 documentation没有解释任何事情,除了这个参数被称为"修饰符"并且它似乎不会以任何方式影响密钥代码,与我放在那里的数字无关。

我很高兴得到解释。

2 个答案:

答案 0 :(得分:3)

您需要了解keyPressed,keyTyped和keyReleased事件之间的区别。

在第一种情况下,生成keyTyped事件。在第二种情况下,会生成keyPressed事件。

然后,您需要查看您将找到的KeyEvent API:

对于按下键和释放键的事件,getKeyCode方法返回事件的keyCode。对于键类型事件,getKeyCode方法始终返回VK_UNDEFINED。

编辑:

实际上上面的答案还不够完整。查看以下演示代码:

public class Main
{
    public static void main(String[] args) throws Exception
    {
        KeyStroke ks1 = KeyStroke.getKeyStroke( 'a' );
        System.out.println( ks1 );
        KeyStroke ks2 = KeyStroke.getKeyStroke('a', 0);
        System.out.println( ks2 );
    }
}

我得到以下输出:

typed a
pressed NUMPAD1

来自getKeyStroke(Character keyChar, int modifiers) API:

请注意,第一个参数是Character而不是char。这是为了避免在调用getKeyStroke(int keyCode,int modifiers)时发生无意的冲突。

所以,我会说修饰语与问题无关。问题是'a'被视为一个int并被映射到一个不同于你预期的KeyStroke。

尝试使用Robot生成角色总是有风险的。以下是您可以使用的一个简单示例:

import java.awt.*;
import java.util.*;
import java.lang.reflect.Field;
import java.awt.event.*;
import javax.swing.*;

public class RobotCharacter
{
    public static void main(String[] args)
        throws Exception
    {
        JTextField textField = new JTextField(10);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.add( textField );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );

        Robot robot = new Robot();
        typeCharacter(robot, "a");
        typeCharacter(robot, "b");
        typeCharacter(robot, "C");
        typeCharacter(robot, "D");
     }

    public static void typeCharacter(Robot robot, String letter)
    {
        try
        {
            boolean upperCase = Character.isUpperCase( letter.charAt(0) );
            String variableName = "VK_" + letter.toUpperCase();

            Class clazz = KeyEvent.class;
            Field field = clazz.getField( variableName );
            int keyCode = field.getInt(null);

            robot.delay(1000);

            if (upperCase) robot.keyPress( KeyEvent.VK_SHIFT );

            robot.keyPress( keyCode );
            robot.keyRelease( keyCode );

            if (upperCase) robot.keyRelease( KeyEvent.VK_SHIFT );
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

使用字母/数字可以正常工作,但是你会遇到特殊字符($,%和& ...)的问题。我建议你寻找一种不同的方法,而不是使用机器人。

您可以尝试创建字符的Hashmap及其对应的KeyEvent.VK _ ???。即使这种方法也存在问题,因为有些角色需要移位键,有些键盘不同,所以有些键盘可能需要换档键而其他键盘可能不需要。

答案 1 :(得分:2)

修饰符是用于同时按压的按位掩码,例如ctrl按钮或shift按钮。不要在那里放任何号码。

KeyStroke.getKeyStroke('a', java.awt.event.InputEvent.SHIFT_DOWN_MASK | java.awt.event.InputEvent.CTRL_DOWN_MASK);

如果按下ctrl或shift按钮并使用' a'

,将正确使用修饰符