import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class NumberLetterDocument extends PlainDocument {
private int length;
private JTextField textField;
public NumberLetterDocument(JTextField textField, int length) {
this.length = length;
this.textField = textField;
}
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
StringBuilder builder = new StringBuilder(str);
StringBuilder builder1 = new StringBuilder(textField.getText());
Pattern p;
String NUM_ALPHA_PATTERN = "[0-9a-zA-Z]";
Matcher m;
// p = Pattern.compile(NUM_ALPHA_PATTERN);
// m = p.matcher(str);
//
// if (!m.matches() ) {
// return;
// }
for (int i = builder.length() - 1; i >= 0; i--) {
int cp = builder.codePointAt(i);
if (!Character.isDigit(cp)
&& !(Character.isLowerCase(cp) || Character.isUpperCase(cp))
&& cp != '/n') {
builder.deleteCharAt(i);
if (Character.isSupplementaryCodePoint(cp)) {
i--;
builder.deleteCharAt(i);
}
}
}
if (offs <= builder1.length() - 1) {
if (builder1.length() + builder.length() > length) {
return;
} else
super.insertString(offs, builder.toString(), a);
} else {
if (builder1.length() + builder.length() <= length) {
super.insertString(offs, builder.toString(), a);
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel pane = new JPanel();
pane.setLayout(new BorderLayout());
JTextField textField = new JTextField();
textField.setDocument(new NumberLetterDocument(textField, 10));
textField.setText("nihaoma!");
pane.add(textField, BorderLayout.NORTH);
frame.add(pane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(400, 300));
frame.setVisible(true);
}
}
意图:对输入框的输入内容加以限制,只能输入字母和数字,并且初始化的时候能够输入默认值。
方案:设计Document,继承自PlainDocument ,重写insertString(int offs, String str, AttributeSet a)方法。
问题:(1)如果使用正则表达式,即使用已经注释了的代码,则在输入的时候可以限制约束,但是不能在初始化的时候输入默认值。
(2)java代码点、Character类方法的含义。
(3)寻找只能输入汉字的方案。