有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何区分常用的打印键盘键和其他键盘键

我想收集键盘输入并将其附加到java StringBuilder中,但使用LWJGL的键盘事件,我最终获取了比我希望的更多的内容,如Shift、CapsLock、Escape、F1到F12、Enter,甚至标点符号等。。这些键也有键ID,但通过附加它们,它们被打印成正方形(我相信是无法识别的字符)

我的目标是忽略这些不可打印的键,而不必创建包含所有这些不需要的键的巨大数组。有什么办法吗

请注意,我希望像\、-&书信电报;等仍然被考虑到字符串中,就像任何文本编辑器一样


共 (2) 个答案

  1. # 1 楼答案

    下面是一个您可以使用的示例。然后将此示例用作内部类,您可以使用它来代替组件上的常规ActionListener。此示例捕获事件的键代码(使用KeyEvent)。我在你的问题中列举了一些例子,我相信如果需要的话,你会发现更多的例子

    在switch语句的每一种情况下,都应该向现有字符串追加一个自定义字符串

    public class CustomListener extends KeyAdapter {
            @Override
            public void keyPressed(KeyEvent e) {
                try {
                    int keyCode = e.getKeyCode();
                    switch (keyCode) {
                            case KeyEvent.VK_SHIFT:
                                //Append a string to your existing string
                                break;
                            case KeyEvent.VK_F1:
                                //Append a string to your existing string
                                break;
                            case KeyEvent.VK_CAPS_LOCK:
                                //Append a string to your existing string
                                break;
                            case KeyEvent.VK_ENTER:
                                //Append a string to your existing string
                                break;
                        }
                    }
                } catch (NullPointerException e1) {
                    e1.printStackTrace();
                }
            }
        }
    
  2. # 2 楼答案

    多亏了Mark W,我才发现ASCII的范围是32到126,128到255,我相信它涵盖了日常文本编辑器中常见的每个字符。非常感谢:)

    下面是一个可能对使用lwjgl的人有用的最小代码块

    private StringBuilder text;
    
        private void updateInput()
        {
            while (Keyboard.next())
            {
                if (Keyboard.getEventKeyState())
                {
                    // get key info
                    int key = Keyboard.getEventKey();
                    char ch = Keyboard.getEventCharacter();
                    int ascii = (int) ch;
    
                    // delete case
                    if(key == Keyboard.KEY_BACK)
                        text.setLength(Math.max(0, text.length() - 1));
    
                    // append if common char
                    if((ascii >= 32 && ascii <= 126) || (ascii >= 128 && ascii <= 255))
                        text.append(ch);
                }
            }
        }