【问题标题】:Problems with java PlainDocument overwriting valuesjava PlainDocument 覆盖值的问题
【发布时间】:2013-02-16 07:34:05
【问题描述】:

下午好。 我正在开发一个屏幕,其中有一个 JTextField 应该始终接收 UpperCase 值​​。看,我刚刚创建了一个派生自 PlainDocument 的类,在 insertString 中对其进行处理,并且它起作用了。 问题是,每当我编辑 JTextField 的值时,它都会覆盖字符串,而不是插入我正在输入的字符串值的中间。示例:我的字段中有值“João da Silva”,我想在“João”之后不久添加名称“Pedro” " 并且在 "da Silva" 之前,但是当我将光标放在键盘的位置并且我想开始输入它时,写入字符串得到 "João Pedrolva ” 而不是“若昂·佩德罗·达席尔瓦”。我希望你已经给予理解。 有人知道怎么修这个东西吗?找了很多方法,试了很多方法都解决不了。

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);
        }
    }
}

谢谢

【问题讨论】:

    标签: java jtextfield uppercase


    【解决方案1】:

    怎么样:

    @Override 
    public void insertString(int offs, String str, AttributeSet a) 
                throws BadLocationException {
    
       if (str == null) {
          return;
       }
    
       super.insertString(offs, str.toUpperCase(), a);
    }
    

    【讨论】:

    • 谢谢。但是还是一样 =/ 大写可以正常工作,我的问题是在它们中间插入新字符时会覆盖值。
    • 您描述的覆盖不会发生在我身上,您的代码也没有显示任何会发生这种情况的东西。也许您有某种 KeyListener 或 KeyBinding 使其行为与您描述的一样?发布 SSCCE。
    【解决方案2】:

    这样写你的方法:

    @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) {
            }
    
        }
    }
    

    抱歉,我没有时间解释。但是,希望您在比较时能发现自己做错了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多