3

次の問題があります。ユーザーがアルファベット値のみを入力するように制限しようとしています。アルファベット順でないその他の値 (キーが押された) は、エラーをスローします。ただし、3 つの例外があり、そのうち 2 つが正常に機能しています。
exception1 : Del Key
exception2 : Back Key
exception3 : Shift <- これは認識されず、理由がわかりません

SurnameSearch.addKeyListener(new KeyAdapter(){
        public void keyPressed(KeyEvent e){
            char ch = e.getKeyChar();
                if(Character.isAlphabetic(ch)|| (ch == KeyEvent.VK_BACK_SPACE) || (ch == KeyEvent.VK_DELETE) || (ch == KeyEvent.VK_SHIFT)){/*null*/}
                  else{
                    JOptionPane.showMessageDialog(null, "Only letters are allowed!");
                    SurnameSearch.setText(" ");
            }
        }
    });

ヒントをいただければ幸いです:)


@マッドプログラマー

例として、ユーザーは姓、名、ミドル ネーム、および携帯電話番号 && 自宅の電話番号をフォームに入力するように要求されます。したがって、明らかに、アルファベット フィールドとその逆に数値は必要ありません :)

4

2 に答える 2

4

キー文字とキーコードを比較しないでください。それらは通常異なるものです。

キーコードは、さまざまなキーボードタイプと入力方法を可能にするために使用される仮想概念です。

代わりに、のようなものを使用してe.getKeyCode() == KeyEvent.VK_SHIFTください。

入力を任意のタイプのテキストコンポーネントに制限しようとしている場合は、必要なKeyListenerインターフェイスではありません。代わりにDocumentFilterを使用することをお勧めします。これにより、フィールドドキュメントに入力されるテキストをyでフィルタリングできます。

これは、いくつかの理由からより良いアプローチです。1つ目は、通知される順序KeyListenersを制御できないことです。つまり、キーストロークは、リスナーに到達する前にテキストコンポーネントにすでに送信されている可能性があります。次に、ユーザーがテキストをフィールドに貼り付けると、KeyListener完全にバイパスされます。

于 2013-03-10T20:30:14.757 に答える
2

これは、Shiftキーに Unicode キー文字がないためです。それはおそらく戻ってきてKeyEvent.VK_UNDEFINEDいます。むしろ、Shiftキーは他のキー押下を変更します (つまり、通常は大文字にします)。

JavadocからgetKeyChar: _

このイベントのキーに関連付けられた文字を返します。たとえば、shift + "a" の KEY_TYPED イベントは "A" の値を返します。

を使用する代わりに、 をgetKeyChar試してくださいgetKeyCode

このイベントのキーに関連付けられた整数の keyCode を返します。

おそらく、プレスにも使用する必要getKeyCharがありますisAlphabetic(それらが重要な場合)。


編集:これは実際の例です:

public static void main(String[] args) {
    JFrame f = new JFrame();
    JButton button = new JButton("Press keys");
    button.addKeyListener(new KeyAdapter() {

        @Override
        public void keyPressed(KeyEvent ke) {
            if (ke.getKeyCode() == KeyEvent.VK_SHIFT) {
                System.out.println("You pressed Shift");
            } else {
                System.out.println("You pressed a non-Shift key");
                // [ more logic ]
            }
        }

    });
    f.add(button, BorderLayout.CENTER);
    f.pack();
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
于 2013-03-10T20:18:10.983 に答える