java - 检测特殊字符的按键

标签 java jbutton keylistener

当按下具有相同字母/符号的键时,我试图更改按钮的背景颜色,但问题是此代码不适用于符号和空格,我做错了什么以及如何修复?

这是代码:

    private String names[]={"`"," 1 "," 2 "," 3 "," 4 "," 5 "," 6 "," 7 "," 8 "," 9 "," 0 "," - "," + ","  Backspace  "
        ,"  Tab  "," Q "," W "," E "," R "," T "," Y "," U "," I "," O "," P "," [ "," ] "," \\ "
        ,"  Caps Lock "," A "," S "," D "," F "," G "," H "," J "," K "," L "," ; "," ' ","  Enter  "
        ,"  Shift  "," Z "," X "," C "," V "," B "," N "," M "," , "," . "," / "," ^ "
        ,"                             "," < "," ! "," > "};


public void keyPressed(KeyEvent event)
    {
        int code= event.getKeyCode();
        String x;

        for(int i=0;i<names.length;i++)
        {

            s=names[i];
            x=s.trim();

            if(x.contentEquals(event.getKeyText(code)) )
            {
                backColor=but[i].getBackground();
                but[i].setBackground(Color.RED);
                break;
            }
        }
    }

    public void keyReleased(KeyEvent event)
    {
        String x;
        int code= event.getKeyCode();

        for(int i=0;i<names.length;i++)
        {
            s=names[i];
            x=s.trim();

            if(x.contentEquals(event.getKeyText(code)))
            {System.out.println("outside");
                but[i].setBackground(backColor);
                break;
            }
        }
    }

问候

最佳答案

我会查看您的 names 数组,并将其与 KeyEvent#getKeyText 的结果进行比较

我的小测试程序输出了这个...

[PRESSED ] "Space"
[TYPED   ] "Unknown keyCode: 0x0"
[RELEASED] "Space"
[PRESSED ] "Enter"
[TYPED   ] "Unknown keyCode: 0x0"
[RELEASED] "Enter"

您的names数组的空间存储为“Space”,它永远不会匹配。

您永远不应该依赖 KeyEvent#getKetText 的结果,因为它没有考虑键盘当前的扩展状态(即,如果按下 Shift 键),这可能会更改按键的状态.

例如,如果我输入 ['],我的测试程序将输出 Quote,但如果我输入 [shift+'](应该生成 ["]),它仍然显示 Quote 。甚至不要让我开始了解 { 和 [ :P

如果您对显示击键文本不感兴趣,最好依靠虚拟键值

public class PaintMyKeys {

    public static void main(String[] args) {
        new    PaintMyKeys();
    }

    public PaintMyKeys() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new PaintMyKeysPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PaintMyKeysPane extends JPanel {

        private JLabel label;

        public PaintMyKeysPane() {

            setLayout(new BorderLayout());

            label = new JLabel("Press space to change colors", JLabel.CENTER);
            label.setOpaque(true);

            add(label);

            addKeyListener(new KeyAdapter() {

                protected int random() {
                    return (int)Math.round(Math.random() * 255);
                }

                protected Color randomColor() {

                    int r = random();
                    int g = random();
                    int b = random();
                    int a = random();

                    return new Color(r, g, b, a);

                }

                @Override
                public void keyReleased(KeyEvent e) {
                    if (e.getKeyCode() == KeyEvent.VK_SPACE) {
                        label.setBackground(randomColor());
                        label.setForeground(randomColor());

                    }
                }
            });

            setFocusable(true);
            requestFocusInWindow();        
        }
    }
}

关于java - 检测特殊字符的按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13423357/

相关文章:

java - 如何在鼠标进入时将KeyListener 添加到JComponent?

java - KeyBindings 和 KeyListeners 之间的区别

java - 当红色矩形与青色矩形碰撞时如何将其移除?

java - 我应该如何处理 dao 层中延迟初始化的 Hibernate 实体以及在不同层中共享状态

java - Selenium 无法仅在 Chrome 上定位 iframe 中的 div

java - 我在 ArrayList 中有 9 个 JButton。但无论如何我都无法更改按钮的标签,,,

java - 使用不显示后面板颜色的透明度覆盖 JButton paintComponent

java - 如何使用 '@Qualifier'动态指定参数?

java - 将表值传递给操作类

java - 带按钮的小程序中的页面转换