要从JTextField
只接受指定的模式,可以使用DocumentFilter
来限制输入内容。以下是一个详细的示例,展示了如何实现这一点:
以下是一个示例代码,展示如何使用DocumentFilter
来限制JTextField
只接受指定的模式(例如,只允许输入数字):
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import java.awt.*;
public class PatternRestrictedTextField extends JFrame {
public PatternRestrictedTextField() {
setTitle("Pattern Restricted JTextField Example");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JTextField textField = new JTextField(20);
((AbstractDocument) textField.getDocument()).setDocumentFilter(new NumericDocumentFilter());
JPanel panel = new JPanel();
panel.add(textField);
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new PatternRestrictedTextField().setVisible(true));
}
class NumericDocumentFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
if (text == null) return;
StringBuilder sb = new StringBuilder(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.insert(offset, text);
if (isValid(sb.toString())) {
super.insertString(fb, offset, text, attr);
}
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
if (text == null) return;
StringBuilder sb = new StringBuilder(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.replace(offset, offset + length, text);
if (isValid(sb.toString())) {
super.replace(fb, offset, length, text, attrs);
}
}
private boolean isValid(String text) {
// 这里可以根据需要修改正则表达式
return text.matches("\\d*");
}
}
}
DocumentFilter
类,用于过滤输入内容。isValid
方法的验证。isValid
方法中的正则表达式,以匹配所需的输入模式。通过这种方式,可以灵活地控制JTextField
的输入内容,确保其符合特定的模式要求。
领取专属 10元无门槛券
手把手带您无忧上云