有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案