java无法筛选和更改JTextField扩展中的文本
我打算将多个DocumentFilters应用于我的定制JTextField,并改变其行为,使所有字母都是大写
我可以做其中一个,但不能同时做两个。这是我分配给自定义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, offset, text, attrs);
}
@Override public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException {
for(DocumentFilterInspector dfi : _documentFilterInspectors) {
if(!dfi.acceptRemove(fb, offset, length)) {
return;
}
}
super.remove(fb, offset, length);
}
@Override public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
for(DocumentFilterInspector dfi : _documentFilterInspectors) {
if(!dfi.acceptReplace(fb, offset, length, text, attrs)) {
return;
}
}
super.replace(fb, offset, length, text, 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,
int offset,
String text,
AttributeSet attr) {
return (fb.getDocument().getLength() + text.length()) <= _limit;
}
@Override public boolean acceptRemove(
FilterBypass fb,
int offset,
int length) {
return true;
}
@Override public boolean acceptReplace(
FilterBypass fb,
int offset,
int length,
String text,
AttributeSet attrs) {
return (fb.getDocument().getLength() + text.length()) <= _limit;
}
}
这是我的自定义文本字段:
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, String str, AttributeSet a) throws BadLocationException {
if (str != null) {
String converted = convertString(str);
super.insertString(fb, offs, converted, a);
}
}
public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {
if (str != null) {
String converted = convertString(str);
super.replace(fb, offs, length, converted, 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();
}
}
共 (0) 个答案