Java 为什么KeyStroke.getKeyStroke(';s';,KeyEvent.ALT_MASK)会创建ALT-F4键绑定?

Java 为什么KeyStroke.getKeyStroke(';s';,KeyEvent.ALT_MASK)会创建ALT-F4键绑定?,java,keylistener,key-bindings,windowlistener,Java,Keylistener,Key Bindings,Windowlistener,运行以下命令: KeyStroke ks1 = KeyStroke.getKeyStroke('s', KeyEvent.ALT_MASK); KeyStroke ks2 = KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.ALT_MASK); KeyStroke ks3 = KeyStroke.getKeyStroke(KeyEvent.VK_F4, KeyEvent.ALT_MASK); System.out.p

运行以下命令:

    KeyStroke ks1 = KeyStroke.getKeyStroke('s', KeyEvent.ALT_MASK);
    KeyStroke ks2 = KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.ALT_MASK);
    KeyStroke ks3 = KeyStroke.getKeyStroke(KeyEvent.VK_F4, KeyEvent.ALT_MASK);

    System.out.println(ks1);
    System.out.println(ks2);
    System.out.println(ks3);
结果:

    alt pressed F4
    alt pressed S
    alt pressed F4
这是因为:

  • char
    “s”的
    int
    值为115
  • KeyEvent.VK_F4
    的int值也是115
这意味着
k1
k3
在功能上是相同的。

这是因为:

  • char
    “s”的
    int
    值为115
  • KeyEvent.VK_F4
    的int值也是115

这意味着
k1
k3
在功能上是相同的。

没有方法getKeyStroke(char,int),因此编译器将您的char's'扩展为int,并称为getKeyStroke(int,int)。后者需要虚拟密钥代码,而不是unicode字符

由于(int)“s”扩展到int 115,与VK_F4重合,因此它完全按照您的要求执行:使用VK_F4和mask ALT创建键绑定


基本上,您想要为char's'创建一个keybinding,但是编译器选择为int 115创建一个keybinding。这是一个简单的错误,假设一个不存在的重载,但是编译器替换了一个兼容的、语义不同的重载。

没有方法getKeyStroke(char,int),因此编译器将char's'扩展为int,并称为getKeyStroke(int,int)。后者需要虚拟密钥代码,而不是unicode字符

由于(int)“s”扩展到int 115,与VK_F4重合,因此它完全按照您的要求执行:使用VK_F4和mask ALT创建键绑定


基本上,您想要为char's'创建一个keybinding,但是编译器选择为int 115创建一个keybinding。这是一个简单的错误,即假设一个不存在的重载,但编译器会替换一个兼容的、语义不同的重载。

问题的一个方面是大写字母a-Z的VK值与其char/int值匹配,因此这些字符的问题是隐藏的。也就是说,使用大写字母“S”可以正常工作,而小写字母“S”则不能正常工作。@BenCole我不会将其称为“方面”,它仍在调用getKeyStroke(int,int)。只有这些值恰好符合预期。我仍然认为代码使用GETKEY SKOKE()以错误的方式。它并不比JScrollPane.setHorizontalScrollBarPolicy(“”)更正确;这也恰好是巧合,就像水平滚动条一样。只要使用大写字符,代码看起来“工作正常”,尽管如您所说,有错误。这是不正确的,不,但它确实可以工作,尤其是在IDE中,人们可能不会注意到getKeyStroke(char,int)不存在。@BenCole是的,我完全同意,它很容易在不知不觉中犯错误,而且不被发现的几率很高。但你想提出的特殊论点是什么?如果你能做到这一点,它可以设计得更好更安全,是的,它当然可以设计得更好。但事实就是这样,而且为了保持兼容性,它将保持这种状态。--我根本不想提出任何论点!我想在遇到StackOverflow时将其添加到StackOverflow中,但找不到任何有关它的信息。问题的一个方面是大写字母A-Z的VK值与其char/int值匹配,因此这些字符的问题是隐藏的。也就是说,使用大写字母“S”可以正常工作,而小写字母“S”则不能正常工作。@BenCole我不会将其称为“方面”,它仍在调用getKeyStroke(int,int)。只有这些值恰好符合预期。我仍然认为代码使用GETKEY SKOKE()以错误的方式。它并不比JScrollPane.setHorizontalScrollBarPolicy(“”)更正确;这也恰好是巧合,就像水平滚动条一样。只要使用大写字符,代码看起来“工作正常”,尽管如您所说,有错误。这是不正确的,不,但它确实可以工作,尤其是在IDE中,人们可能不会注意到getKeyStroke(char,int)不存在。@BenCole是的,我完全同意,它很容易在不知不觉中犯错误,而且不被发现的几率很高。但你想提出的特殊论点是什么?如果你能做到这一点,它可以设计得更好更安全,是的,它当然可以设计得更好。但事实就是这样,而且为了保持兼容性,它将保持这种状态。--我根本不想提出任何论点!我想将它添加到StackOverflow中,因为我遇到了它,但找不到任何有关它的信息。