0

JTextField を使用してユーザーに電話番号を入力させる Swing アプリケーションを開発しています。セキュリティのため、ユーザーが電話番号を入力する際に​​、中央の 4 桁をワイルドカードとして表示する必要があります。一方、この JTextField は、電話番号がデータベースからのものである場合、ワイルドカードとして中央の 4 桁も表示します。

JTextField をカスタマイズする方法は? どんな助けでも大歓迎です。

4

1 に答える 1

3

を使用しDocumentFilterます。

この例を参照new PhoneNumberFilter(6,10,'*')してください。正確なニーズに合わせて変更してください。

FI 南アフリカには 10 桁の電話番号があり、最初の 3 桁はダイヤル コードで、残りは固有の番号です。

したがって、最後の 4 桁を *** でマスクし、電話番号全体が 10 桁の場合、最後の 4 桁new PhoneNumberFilter(6,10,'*')(10-6=4) をマークします。

ここに画像の説明を入力

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class Test {

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                //create instance of our custom DocumentFiler class
                PhoneNumberFilter phoneNumberFilter = new PhoneNumberFilter(6, 10, '*');


                JTextField jtf = new JTextField(10);
                //add filter to JTextField
                ((AbstractDocument) jtf.getDocument()).setDocumentFilter(phoneNumberFilter);
                frame.add(jtf);

                frame.pack();
                frame.setVisible(true);

                //jtf.setText("0119887654");
            }
        });
    }

    public static void main(String[] args) {
        new Test();
    }
}

class PhoneNumberFilter extends DocumentFilter {

    private int textLength = 0;//keeps track of length of text within the field (used to check if we should start applying the mask)
    private int numberMaskStartIndex;
    private int numberMaskEndIndex;
    private String mask;//what the characters in the specified ranges positions will be replaced with

    public PhoneNumberFilter(int start, int end, char mask) {
        numberMaskStartIndex = start;
        numberMaskEndIndex = end - 1;
        this.mask = String.valueOf(mask);
    }

    @Override
    public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
        if (string.length() > 1) {
            for (int n = string.length() - 1; n >= 0; n--) {//an inserted string may be more than a single character i.e copy and pasting a number
                char c = string.charAt(n);//get a single character of the string
                if (n >= numberMaskStartIndex && n <= numberMaskEndIndex) {//check if its between the range which we should mask
                    super.replace(fb, i, i1, mask, as);
                } else {
                    super.replace(fb, i, i1, String.valueOf(c), as);
                }
                textLength++;
            }
        } else if (textLength >= numberMaskStartIndex && textLength <= numberMaskEndIndex) {//only a singe character was inserted and its between the range which we should mask
            super.replace(fb, i, i1, mask, as);
            textLength++;
        } else {
            super.replace(fb, i, i1, string, as);
            textLength++;
        }
    }

    @Override
    public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
        super.remove(fb, i, i1);
        if (i == 0 && i1 == textLength) {//if the text removed is the entire textfield i.e CTRL+A or Mouse dragged and DEL than we reset our counter which keeps track of the number of characters in the textfield
            textLength = 0;
        } else {//only a single character was deleted
            textLength--;
        }
    }

    @Override
    public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
        super.insertString(fb, i, string, as);
    }
}

ユーザー入力を制限する機能を追加していないため、何でも入力できます。上記は、必要なロジックを示すためのものです。

セキュリティのため、ユーザーが電話番号を入力する際に​​、中央の 4 桁をワイルドカードとして表示する必要があります。一方、この JTextField は、電話番号がデータベースからのものである場合、ワイルドカードとして中央の 4 桁も表示します

DocumentFilter も適用されるため、データベースから取得したときに機能するかどうかをまだ尋ねるかもしれません。setText(..);

于 2013-06-30T10:01:22.183 に答える