gpt4 book ai didi

java - 如何一起使用 MaskFormatter 和 DocumentFilter

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:48:05 25 4
gpt4 key购买 nike

我需要一个 JFormattedTextField 只允许输入 ##-###** 其中连字符始终出现在文本字段中,最后一个2 个字符,由 * 表示,可以是 2 个字母表 (a-z/A-Z),也可以什么都不是。

我知道如何解决部分问题,但不确定如何将所有内容组合在一起。我知道使用 ##-###**MaskFormatter 会给我始终存在的连字符,但我无法执行最后一个规则2 个字符要么是字母,要么什么都不是。此外,MaskFormatter 将用最后一个不需要的有效插入替换任何删除。

我也知道我可以使用 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();
}
}

我在使用它时遇到的问题是我无法让连字符始终出现在文本字段中。

有人可以帮我完成这两个所需功能之间的桥梁吗?

最佳答案

"there is no way for me to enforce the rule of the last 2 characters being either letters or numbers."

抱歉,没看到您正在使用 MaskFormatter。如果您查看 API docs ,您会看到可能的字符格式图表

  • # 任何有效数字,使用 Character.isDigit。
  • ' 转义字符,用于转义任何特殊格式字符。
  • U 任何字符 (Character.isLetter)。所有小写​​字母都映射为大写字母。
  • L 任何字符 (Character.isLetter)。所有大写字母都映射为小写字母。
  • A 任何字符或数字(Character.isLetter 或 Character.isDigit)
  • ? 任何字符 (Character.isLetter)。
  • * 任何东西。
  • H 任何十六进制字符(0-9、a-f 或 A-F)。

所以你实际上可以只使用 "##-####UU"


EDIT 使用 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);
}
}

关于java - 如何一起使用 MaskFormatter 和 DocumentFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23616927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com