0
private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
int x=evt.getKeyCode();
if(x>=96&&x<=105)
  {
      evt.setKeyCode(8);//Here 8 is used for Backspace key to remove the numeric character entered
  }

Int このコードは、ユーザーが jTextField に数値を入力しないようにしたいのですが、入力した場合は、実行時にのみ削除しようとしています....このコードを書きましたが、期待どおりに動作しません.. . Plzz助けて!!

4

2 に答える 2

2

あなたは本当に避けるべきですKeyListeners、それらはあなたが最終的に達成しようとしていることを制限しすぎており、フィールドがドキュメントを変更しようとしている間にフィールドドキュメントを変更しようとすると、ミューテーション例外が発生するだけです.

本当にDocumentFilterを使用する必要があります。それが設計の目的です。

((AbstractDocument)field.getDocument()).setDocumentFilter(new DocumentFilter() {

    @Override
    public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {

        StringBuilder sb = new StringBuilder(64);
        for (char c : text.toCharArray()) {

            if (Character.isDigit(c)) {

                sb.append(c);

            }

        }

        fb.insertString(offset, text, attr);

    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {

        StringBuilder sb = new StringBuilder(64);
        for (char c : text.toCharArray()) {

            if (Character.isDigit(c)) {

                sb.append(c);

            }

        }

        fb.replace(offset, length, sb.toString(), attrs);

    }

});

これは本当に基本的な例で、SO にはたくさんあります。

突然変異の例外を回避することとは別に、フィルターはドキュメント/フィールドに到達する前に更新をインターセプトするため、受信した変更が画面に表示されず、貼り付けイベントまたはsetText呼び出しもキャプチャされます。

于 2012-09-05T17:55:16.423 に答える
0

最善の方法ではないかもしれませんが、非常に簡単な方法を 1 つ紹介します。

次のようなpaintComponent()メソッドをオーバーライドできます。JTextField

JTextField textField = new JTextField(text) {

@Override
protected void paintComponent(Graphics grphcs) {
    super.paintComponent(grphcs);
    String newStr = "";
    for (char c : getText().toCharArray()) {
        if (!Character.isDigit(c)) {
            newStr += c;
        }
    }
    setText(newStr);

    }
};
于 2012-09-05T18:01:41.583 に答える