此代码始终返回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:请注意,第一个参数的类型为Character而不是char。这是为了避免与getKeyStroke(int keyCode,int修饰符)的调用发生意外冲突。
因此,我想说修饰符与问题无关。问题是“ 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);
}
}
}
可以很好地使用字母/数字,但是特殊字符($,%和&...)始终会出现问题。我建议您寻找一种不同的方法,而不要使用机器人。
您可以尝试创建字符的Hashmap及其对应的KeyEvent.VK _ ???。即使这种方法也有问题,因为某些字符需要使用Shift键,而有些键盘是不同的,因此有些键盘可能需要Shift键,而其他键盘则不需要。