【问题标题】:Detecting Key presses for Special Characters检测特殊字符的按键
【发布时间】:2012-11-05 13:52:09
【问题描述】:

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

代码如下:

    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;
            }
        }
    }

问候

【问题讨论】:

    标签: java jbutton keylistener


    【解决方案1】:

    我会查看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();        
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      作为一般规则,getKeyText() 的结果在浏览器中是不统一的,并且与实际上是文本(字母和数字)的键无关。

      我认为您应该重新考虑使用 getKeyCode() 的方法。

      有用的链接:

      • This page 可用于测试哪个 keyCode 与 钥匙。
      • This page为你提供了key和key之间的映射 代码。

      【讨论】:

        【解决方案3】:

        据我所知,getKeyText() 方法返回的是单词而不是大多数符号(例如,“.”的代码产生“PERIOD”)。不要在名称数组中使用“.”等类似名称,而是使用“PERIOD”和“SPACE”。

        Here 是 getKeyText() 方法的代码,它准确显示了哪些字符将返回密钥的名称。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-02
          • 1970-01-01
          • 1970-01-01
          • 2022-11-22
          • 1970-01-01
          • 2023-03-14
          相关资源
          最近更新 更多