0

下午好。我正在开发一个屏幕,其中有一个JTextField,它应该始终接收大写值​​。看,我刚刚创建了一个派生自PlainDocument的类,在insertString中对其进行处理,并且它起作用了。问题是,每当我编辑 JTextField 的值时,它都会覆盖字符串,而不是插入我正在输入的字符串值的中间。示例:我的字段中有值“ João da Silva ”,我想在“ João ”之后和“ da Silva ”之前添加名称“ Pedro ”,João Pedrolva ”而不是“ João Pedro da 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);
        }
    }
}

谢谢

4

2 回答 2

1

关于什么:

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

   if (str == null) {
      return;
   }

   super.insertString(offs, str.toUpperCase(), a);
}
于 2013-01-18T18:30:39.183 回答
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) {
        }

    }
}

对不起,我没有时间解释。但是,希望您在比较时可以看到自己做错了什么。

于 2013-02-15T23:34:05.520 回答