java - getKeyStroke(char) 与 getKeyStroke(char, int) - 我不明白区别

标签 java parameters keystroke

此代码始终返回 0:

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

虽然这个返回实际的关键代码:

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

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

我很高兴得到解释。

最佳答案

您需要了解 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:

请注意,第一个参数是字符类型而不是字符类型。这是为了避免与 getKeyStroke(int keyCode, int modifiers) 的调用发生无意的冲突。

所以,我想说修饰符与问题无关。问题是“a”被视为 int 并映射到与您预期不同的 KeyStroke。

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

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);
        }
    }
}

处理字母/数字效果很好,但处理特殊字符($、%、&...)时总会遇到问题。我建议您寻找不同的方法而不是使用机器人。

您可以尝试创建一个字符及其对应的KeyEvent.VK_???的Hashmap。即使这种方法也存在问题,因为有些字符需要 Shift 键,而有些键盘不同,因此有些字符可能需要 Shift 键,而其他字符可能不需要。

关于java - getKeyStroke(char) 与 getKeyStroke(char, int) - 我不明白区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33333353/

相关文章:

java - 解析并删除java正则表达式中的特殊字符

function - LISP:以谓词作为参数

java - JTable单元格编辑可以消耗按键吗?

bash - 如何: Simulating keystroke inputs in shell to an app running in an embedded target

c++ - SendInput() 不能正确管理 Alt 代码

java - isInstance 中的 ClassNotFoundException

java - 最快次要GC的收集器

java - 如何使字符串表现得像整数?

php - 参数号无效 : parameter was not defined in {path}

c++ - 为函数 Y 的参数 X 给出的默认参数