我们在做JAVA GUI开发的时候,有的时候需要对文本框中的内容进行限制,比如最大长度、转换为大写等。今天就为大家介绍一下该如何实现。
通过查阅JDK API,我们可以知道,在JTextField
中提供了setDocument(Document doc)
方法,用于将编辑器与一个文本文档关联。那么我们就需要使用它啦。
Document
是一个接口,有如下几个实现类:
- AbstractDocument
- DefaultStyledDocument
- HTMLDocument
- PlainDocument
这里我们需要使用的就是PlainDocument
,PlainDocument
维护无任何字符属性的普通文档。此文档的默认元素结构是文本中的行的映射。由 getDefaultRootElement 返回的 Element 是行的映射,且每个子元素表示一行。此模型不维护任何字符级属性,但每行都可以用一个任意的属性集来标记。使用默认的根元素可以快速执行从行到偏移量和从偏移量到行的转换。由编辑激发的 DocumentEvent 的结构信息将指示行结构的更改。 默认的内容存储管理是通过间隙缓冲区实现 (GapContent) 执行的。如果编辑是连续的或集群化的(正如常见的那样),此操作支持对大型文档的高效合理编辑。
在PlainDocument
中提供了insertString(int offs, String str, AttributeSet a)
,用于向文档中插入某些内容,所以我们只需要重写该方法就可以了。
首先我们先来写一个将输入字符转换为大写的示例:
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class UpperDocument extends PlainDocument
{
private static final long serialVersionUID = 1L;
@Override
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException
{
if (str == null)
{
return;
}
char[] upper = str.toCharArray();
for (int i = 0; i < upper.length; i++)
{
upper[i] = Character.toUpperCase(upper[i]);
}
super.insertString(offs, new String(upper), a);
}
}
编写测试方法:
import javax.swing.JFrame;
import javax.swing.JTextField;
public class InputToUpperTest
{
public static void main(String[] args)
{
JTextField textField = new JTextField();
textField.setDocument(new UpperDocument());
JFrame frame = new JFrame();
frame.add(textField);
frame.setSize(300, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
是不是很简单,接下来我们再来实现一个通过正则校验输入内容的文档:
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class RegexDocument extends PlainDocument
{
private static final long serialVersionUID = 1L;
private String regex = null;
public RegexDocument()
{
super();
}
public RegexDocument(String regex)
{
this();
this.regex = regex;
}
@Override
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException
{
if (str == null)
{
return;
}
if (regex != null)
{
if (!new StringBuilder(getText(0, getLength())).insert(offs, str)
.toString().matches(regex))
{
return;
}
super.insertString(offs, str, a);
}
else
{
super.insertString(offs, str, a);
}
}
}
继续编写测试方法对其进行测试:
import javax.swing.JFrame;
import javax.swing.JTextField;
public class InputValidTest
{
public static void main(String[] args)
{
JTextField textField = new JTextField();
textField.setDocument(new RegexDocument("\\d{0,10}"));
JFrame frame = new JFrame();
frame.add(textField);
frame.setSize(300, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
通过上面两个示例,相信大家已经知道了如何限制输入框输入的内容了,在实际应用中,我们可以根据实际情况编写我们自己的PlainDocument
。