JTextField を使用してユーザーに電話番号を入力させる Swing アプリケーションを開発しています。セキュリティのため、ユーザーが電話番号を入力する際に、中央の 4 桁をワイルドカードとして表示する必要があります。一方、この JTextField は、電話番号がデータベースからのものである場合、ワイルドカードとして中央の 4 桁も表示します。
JTextField をカスタマイズする方法は? どんな助けでも大歓迎です。
JTextField を使用してユーザーに電話番号を入力させる Swing アプリケーションを開発しています。セキュリティのため、ユーザーが電話番号を入力する際に、中央の 4 桁をワイルドカードとして表示する必要があります。一方、この JTextField は、電話番号がデータベースからのものである場合、ワイルドカードとして中央の 4 桁も表示します。
JTextField をカスタマイズする方法は? どんな助けでも大歓迎です。
を使用し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(..);