如何解决无法在 JTextField 扩展中过滤和更改文本
我打算将多个 DocumentFilters 应用到我的自定义 JTextField AND 更改其行为,因此所有字母都为大写。
我可以做一个或另一个,但我不能同时做。这是我分配给自定义 JTextField 的自定义文档。
class UpperCaseDocument extends PlainDocument {
private static final long serialVersionUID = 1L;
private List<DocumentFilterInspector> _documentFilterInspectors;
public UpperCaseDocument(List<DocumentFilterInspector> documentFilterInspectors) {
_documentFilterInspectors = documentFilterInspectors;
setDocumentFilter(new DocumentFilter() {
@Override public void insertString(FilterBypass fb,int offset,String text,AttributeSet attrs) throws BadLocationException {
for(DocumentFilterInspector dfi : _documentFilterInspectors) {
if(!dfi.acceptInsertString(fb,offset,text,attrs)) {
return;
}
}
super.insertString(fb,attrs);
}
@Override public void remove(DocumentFilter.FilterBypass fb,int length) throws BadLocationException {
for(DocumentFilterInspector dfi : _documentFilterInspectors) {
if(!dfi.acceptRemove(fb,length)) {
return;
}
}
super.remove(fb,length);
}
@Override public void replace(FilterBypass fb,int length,AttributeSet attrs) throws BadLocationException {
for(DocumentFilterInspector dfi : _documentFilterInspectors) {
if(!dfi.acceptReplace(fb,length,attrs)) {
return;
}
}
super.replace(fb,attrs);
}
});
}
@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);
}
}
DocumentFilterInspector 是一个允许使用特定过滤器的接口,例如:
public class CharacterLimitFilter implements DocumentFilterInspector {
private int _limit;
public CharacterLimitFilter(int limit) {
_limit = limit;
}
@Override public boolean acceptInsertString(
FilterBypass fb,AttributeSet attr) {
return (fb.getDocument().getLength() + text.length()) <= _limit;
}
@Override public boolean acceptRemove(
FilterBypass fb,int length) {
return true;
}
@Override public boolean acceptReplace(
FilterBypass fb,AttributeSet attrs) {
return (fb.getDocument().getLength() + text.length()) <= _limit;
}
}
这是我的自定义 TextField:
public class TextFieldUI extends JTextField {
private static final long serialVersionUID = 1L;
private List<DocumentFilterInspector> _documentFilterInspectors;
public TextFieldUI() {
super();
init();
}
public TextFieldUI(int columns) {
super(columns);
init();
}
private final void init() {
_documentFilterInspectors = new ArrayList<DocumentFilterInspector>();
setDocument(new UpperCaseDocument(_documentFilterInspectors));
setFont(new Font(Font.MONOSPACED,Font.PLAIN,14));
}
public synchronized void addDocumentFilterInspector(DocumentFilterInspector inspector) {
_documentFilterInspectors.add(inspector);
}
public synchronized void removeDocumentFilterInspector(DocumentFilterInspector inspector) {
_documentFilterInspectors.remove(inspector);
}
}
**************** 更新 ****************
非常感谢camickr。我使用了他出色的代码,它运行得非常好!!!链接在他的评论中......
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
/**
* The UpperCaseDocumentFilter converts all characters to upper case before
* the characters are inserted into the Document.
*/
public class UpperCaseDocumentFilter extends ChainedDocumentFilter {
/**
* Standard constructor for stand alone usage
*/
public UpperCaseDocumentFilter() {}
/**
* Constructor used when further filtering is required after this
* filter has been applied.
*/
public UpperCaseDocumentFilter(DocumentFilter filter) {
super(filter);
}
public void insertString(FilterBypass fb,int offs,AttributeSet a) throws BadLocationException {
if (str != null) {
String converted = convertString(str);
super.insertString(fb,offs,converted,a);
}
}
public void replace(FilterBypass fb,AttributeSet a) throws BadLocationException {
if (str != null) {
String converted = convertString(str);
super.replace(fb,a);
}
}
/**
* Convert each character in the input string to upper case
*
* @param mixedCase a String of mixed case characters
* @return an upper cased String
*/
private String convertString(String mixedCase) {
return mixedCase.toUpperCase();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。