【问题标题】:Java Keyboard get shifted charJava键盘得到移位字符
【发布时间】:2012-06-20 05:51:30
【问题描述】:

我为我的应用制作了一个按键监听器,当用户按下 shift 键 + a 键时,我需要识别按键代码。

例如,当用户按下 shift 键 + 键 2(英文键盘)时,它应该打印 @。我做了一个快速开关/案例来识别哪个是 shift 键,但它不适用于 azerty 键盘和 mac 键盘。

有没有办法在 java 中获取移位的键或其他东西?

这很难解释。

我的 java 应用程序只是获取键码,我需要的是与键码关联的移位键码。

例如:

  • (QWERTY) 2 => @; 3 => #;等等……
  • (AZERTY) & => 1; é => 2;等等……

目前,我的代码是这样的(仅适用于 qwerty KB)

String value = String.valueOf((char)key);
    if (shift)
    {
        switch (value.charAt(0))
        {
            case '1':
                return "!";
            case '2':
                return "@";
            case '3':
                return "#";

            .....

感谢您的帮助。

问候。

【问题讨论】:

标签: java keyboard shift qwerty


【解决方案1】:

尝试使用KeyEvent#getKeyChar()。对于事件Shift+a,这将返回A。但这仅适用于 KeyListener#keyTyped() 方法,不适用于其他方法 (keyReleased/keyPressed)。 这是一个小例子,效果很好。我尝试了不同的键盘布局。您的示例 (Shift+2) 在 qwerty 等中返回 @

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;

public class Maion {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(600, 400);
        frame.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                System.out.println("keyTyped: '" + e.getKeyChar() + "'");
            }
        });
        frame.setVisible(true);
    }
}

【讨论】:

  • 不,这只是给了我关键代码,而不是移位的。但修饰符定义明确。
  • @Vodemki 我添加了一个小例子。它工作得很好......我得到@ for Shift+2 with qwerty...
  • 好吧,我的问题是我正在使用 JNI 代码捕获关键代码。所以我有一个名为 nativeKeyTyped 的函数,它接收一个 NativeKeyEvent。此事件的工作方式与您给我的 KeyEvent 完全相同。如果我在键入键时读取修饰符,则在未按下 shift 键时它给我“0”,当它按下时给我“1”。但是当我用 getKeyChar 读取关键代码时,总是返回一个“小”字符。
  • @Vodemki 我认为这与KeyEvent#getKeyChar() 仅对KeyEvent.KEY_TYPED 事件“有效”有关。您的活动是KeyEvent.KEY_TYPED 活动吗?如果没有,您要么必须更改您的 JNI 代码(如果可以访问),手动将您的关键事件转换为正确的字符,或者使用不同的方法来收集关键事件。
  • 好的,谢谢。由于我无法编辑 JNI 代码,我将手动转换每个键。这听起来是最简单的方法。
【解决方案2】:

查看 KeyEvent 类中的 getModifiers() 方法。这将告诉您按下了哪些特殊键(Alt、Ctrl、Shift)

例子:

boolean oneShift = (keyEvent.getKeyCode() == KeyEvent.VK_1) && "Shift".equals(KeyEvent.getKeyModifiersText(keyEvent.getModifiers()))

【讨论】:

  • 我已经有了那个代码。我需要的只是在按下 shift 时按下的键的关联键码。例如:SHIFT + 1 给我!
  • 您的示例仅在用户按住 Shift 时才有效。正确的方法(使用 getModifiers())是boolean shift = (keyEvent.getModifiers() & KeyEvent.VK_SHIFT) == KeyEvent.VK_SHIFT;
  • 除此之外,这不是 OP 所要求的。 ;)
  • 是的,因为我使用 JNI 制作了监听器。所以是的,用户必须按住 shift 才能使用该命令。但这不是这里的问题。除了使用 switch/case 之外,还有另一种方法来获得移位的字符吗?我的意思是 java 中的一种函数,它将获取关键代码并返回一个移位的代码。
【解决方案3】:

最后,我制作了一个框架,允许用户选择他的键盘布局。然后我就做了一个简单的 swith/case 来获得 shift 键。

String value = String.valueOf((char)key);
if (shift && keyboard.equals("QWERTY"))
{
    switch (value.charAt(0))
    {
        case '1':
            return "!";
        case '2':
            return "@";
        case '3':
            return "#";
    }
}
else if (shift && keyboard.equals("AZERTY"))
{
    switch (value.charAt(0))
    {
        case '&':
            return "1";
        case 'é':
            return "2";
        case '"':
            return "3";
    }
}
else return value;

我希望这可以帮助其他人。

问候。

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2011-11-09
    • 2014-01-17
    相关资源
    最近更新 更多