1

私の最初のプログラムに取り組んでいます。入力されたくない文字を識別する方法を見つけました。入力した最後の文字を削除して、ユーザーの観点から数字のみを入力できるように表示する方法を知りたいです。

@Override
public void keyPressed(KeyEvent e) {
    char keyChar = e.getKeyChar();;
    char[] badCharArray = "abcdefghijklmnopqrstuvwxyz-`~!@#$%^&*()[]{}<>_+=|\"':;?/ ".toCharArray();
        for (int i = 0; i < badCharArray.length; i++) {
            if (badCharArray[i] == keyChar) {
                System.out.print(badCharArray[i] + " bad\n");
                hourlyWageInput.setBackground(Color.RED);
                } 
            }
        }

ありがとう。 ここに画像の説明を入力

4

4 に答える 4

4

これを行う最も簡単な方法は、JTextField の代わりに JFormattedTextField を使用することです。

NumberFormat format = NumberFormat.getNumberInstance();
format.setMinimumFractionDigits(2); // eventually maximum fraction digits

JFormattedTextField fld = new JFormattedTextField(format);
于 2012-08-06T22:11:05.393 に答える
4

You should avoid keyListeners in this case. What happens if the user pastes text into field. The keyListener will not be notified, allowing invalid characters to be inserted.

You're better of using DocumentFilter to filter out any invalid characters you don't want.

Take a look at Implementing a DocumentFilter for more information and DocumentFilter for some nice examples

于 2012-08-06T22:45:44.093 に答える
1

JTextField の作成は次のとおりです。

hourlyWageInput = new JTextField("7.25");
DocumentFilter filter = new UppercaseDocumentFilter();
((AbstractDocument) hourlyWageInput.getDocument()).setDocumentFilter(filter);
hourlyWageInput.setHorizontalAlignment(JTextField.CENTER);
add(hourlyWageInput);

ここに私の DocumentFilter があります:

import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class UppercaseDocumentFilter extends DocumentFilter {

     public void replace(DocumentFilter.FilterBypass fb, int offset, int length,
          String text, javax.swing.text.AttributeSet attr)

          throws BadLocationException {
               fb.insertString(offset, text.replaceAll("\\D", ""), attr);   
     }
}

これは機能し、JTextField からすべての文字と文字が自動的に削除されます。ありがとう、これは確かに最高です。

しかし、「\D」に似たすべてのコマンドを含む場所を誰かが知っているかどうか疑問に思っていました. 正しい情報を見つけるのに時間がかかりました。

また、私が今持っているコードも. 私はダブルスを扱っているので、必要なタイプではありません。何か案は?

助けてくれてありがとう、今日私がどれだけ多くのことを学んだかは驚くべきことです. 13 時間連続でコーディングしています。

于 2012-08-07T02:43:03.627 に答える
1

キャレット位置の前の文字なしで、そのテキストを現在のテキストに設定するだけです


    @Override
    public void keyReleased(KeyEvent paramKeyEvent) {
        char keyChar = paramKeyEvent.getKeyChar();
        char[] badCharArray = "abcdefghijklmnopqrstuvwxyz-`~!@#$%^&*()[]{}<>_+=|\"':;?/ ".toCharArray();
            for (int i = 0; i < badCharArray.length; i++) {
                if (badCharArray[i] == keyChar) {
                    int caret = field.getCaretPosition()-1;
                    System.out.print(badCharArray[i] + " bad\n");
                    field.setText(field.getText().substring(0, caret) + 
                            field.getText().substring(caret+1));
                    field.setCaretPosition(caret);
                    } 
            }
    }

自動修正するかのように、設定を赤にしましたが、そこにある意味はありません(おそらく、1秒間赤を表示するように設定しますか?)


実際、それに関する唯一の問題は、無効なキーを保持している場合、最後のキーのみが削除されることです。以下ははるかにうまく機能し、キャレットをシフトしません:P

        boolean held = false;
        private int oldCaret = 1;
        @Override
        public void keyPressed(KeyEvent e) {
            if(! held) {
                oldCaret=field.getCaretPosition();
                System.out.println(oldCaret);
            }
            held = true;

        }
        @Override
        public void keyReleased(KeyEvent paramKeyEvent) {
            char keyChar = paramKeyEvent.getKeyChar();
            char[] badCharArray = "abcdefghijklmnopqrstuvwxyz-`~!@#$%^&*()[]{}<>_+=|\"':;?/ ".toCharArray();
            for (int i = 0; i < badCharArray.length; i++) {
                if(field.getText().contains(badCharArray[i]+"")) {
                    field.setText(field.getText().replace(badCharArray[i]+"", ""));
                    field.setCaretPosition(oldCaret);
                }
            }

            held=false;
        }
于 2012-08-06T22:13:50.753 に答える