java PlainDocument覆盖值的问题

时间:2013-01-18 17:52:34

标签: java jtextfield uppercase

下午好。 我正在开发一个屏幕,其中我有 JTextField ,它应始终接收 UpperCase 值。看,我刚创建了一个派生自 PlainDocument 的类,在 insertString 中处理它,并且它有效。 问题是每当我编辑我的JTextField的值时,它都会覆盖字符串而不是插入我正在键入的字符串值。示例:我的字段中包含值“JoãodaSilva ”,我想在“João之后不久添加名称” Pedro “ “然后在” da Silva “之前,但是当我将光标放在键盘的位置并且我想开始输入它的写入字符串”JoãoPedrolva “而不是”JoãoPedroda Silva “。我希望你能理解。 有人知道怎么修这个东西吗?我经常搜索并尝试了许多方法,但无法解决。

import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;

public class UpperCaseField extends JTextField {

    private static final long serialVersionUID = 1L;

    public UpperCaseField() {
        super();
    }

    protected Document createDefaultModel() {
        return new UpperCaseDocument();
    }

    static class UpperCaseDocument 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);
        }
    }
}

由于

2 个答案:

答案 0 :(得分:1)

怎么样:

@Override 
public void insertString(int offs, String str, AttributeSet a) 
            throws BadLocationException {

   if (str == null) {
      return;
   }

   super.insertString(offs, str.toUpperCase(), a);
}

答案 1 :(得分:0)

以这种方式编写方法:

@Override
public void insertString(int offset, String text, AttributeSet attributes) throws BadLocationException {

    if (text != null) {

        int currentBufferLength = getLength();
        String currentBufferContent = getText(0, currentBufferLength);

        String newText;

        if (currentBufferLength == 0) {
            newText = text;
        } else {
            newText = new StringBuilder(currentBufferContent)
                    .insert(offset, text)
                    .toString();
        }

        try {
                super.insertString(offset, text.toUpperCase(), attributes);
        } catch (BadLocationException exception) {
        }

    }
}

抱歉,我没有时间解释。但是,希望你比较时可以看到你做错了什么。