0

同じ文字/記号のキーが押されたときにボタンの背景色を変更しようとしていますが、問題は、このコードが記号とスペースに対して機能しないことです。何が間違っているのでしょうか?どうすれば修正できますか?

コードは次のとおりです。

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

よろしく

4

3 に答える 3

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();        
        }
    }
}
于 2012-11-16T21:04:44.013 に答える
0

私が知る限り、getKeyText() メソッドはほとんどの記号ではなく単語を返します (たとえば、"." のコードは "PERIOD" を生成します)。名前配列に「 . 」などを含める代わりに、「 PERIOD 」と「 SPACE 」を使用します。

getKeyText () メソッドのコードは次のとおりです。キーの名前を返す文字を正確に示しています。

于 2012-11-16T19:57:57.027 に答える
0

原則として、 の結果はgetKeyText()ブラウザー間で均一ではなく、キーが実際にテキスト (文字と数字) である他のものとは無関係です。

getKeyCode()代わりに使用するアプローチを再考する必要があると思います。

便利なリンク:

  • このページは、どの keyCode がキーに関連付けられているかをテストするのに役立ちます。
  • このページでは、キーとキー コード間のマッピングを提供します。
于 2012-11-16T19:54:05.743 に答える