我需要一个JFormattedTextField,它只允许输入连字符总是出现在文本字段中的##-###**,最后两个字符(由*表示)可以是字母表中的两个字母( all /all),也可以是零。
我知道如何解决这部分问题,但不太确定如何把所有的事情整合在一起。我知道使用MaskFormatter of ##-###**会给我始终存在的连字符,但是我没有办法强制执行最后两个字符的规则,要么是字母,要么什么都没有。此外,MaskFormatter将用最后一个有效的插入替换任何删除,这是不可取的。
我还知道,我可以通过使用regexes (类似于这个功能,但使用不同的regex),使用DocumentFilter只允许我想要的格式:
public void insertString(FilterBypass fb, int offs, int length, String str, AttributeSet a)
throws BadLocationException {
String text = fb.getDocument().getText(0, fb.getDocument().getLength());
text += str;
if ((fb.getDocument().getLength() + str.length()
- length) <= maxCharacters && text.matches("^[0-9]+[.]?[0-9]{0,1}$")) {
super.replace(fb, offs, length, str, a);
} else {
Toolkit.getDefaultToolkit().beep();
}
}我所看到的问题是,在文本字段中,连字符总是不存在。
有人能帮我完成这两种功能之间的桥梁吗?
发布于 2014-05-13 16:15:07
“我没有办法强制执行最后两个字符的规则,要么是字母,要么是数字。”
很抱歉没看到你在用MaskFormatter。如果您查看API文档,您将看到一个可能的字符格式的图表
#任何有效的数字,使用Character.isDigit。'逃逸字符,用于转义任何特殊格式字符。U任意字符(Character.isLetter)。所有小写字母都映射到大写。L任意字符(Character.isLetter)。所有大写字母都映射到小写。A任何字符或数字(Character.isLetter或Character.isDigit)?任意字符(Character.isLetter)。*什么都行。H任何十六进制字符(0-9,a-f或A).所以你可以直接用"##-####UU"
使用InputVerifier编辑
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class TestMaskFormatter {
private static final String REGEX = "^\\d{2}\\-\\d{4}([A-Z]{2})??";
private static InputVerifier getInputVerifier() {
InputVerifier verifier = new InputVerifier() {
@Override
public boolean verify(JComponent input) {
JTextField field = (JTextField) input;
String text = field.getText();
return text.matches(REGEX) || text.isEmpty();
}
@Override
public boolean shouldYieldFocus(JComponent input) {
boolean valid = verify(input);
if (!valid) {
JOptionPane.showMessageDialog(null, "Must Match format: 00-0000AA");
JTextField field = (JTextField) input;
field.setText("");
}
return valid;
}
};
return verifier;
}
public static void main(String[] args) {
JTextField fieldWithVerifier = new JTextField(10);
fieldWithVerifier.setInputVerifier(getInputVerifier());
JTextField field1 = new JTextField(10);
JPanel panel = new JPanel();
panel.add(fieldWithVerifier);
panel.add(field1);
JOptionPane.showMessageDialog(null, panel);
}
}https://stackoverflow.com/questions/23616927
复制相似问题