2013-01-18 92 views
0

下午好。 我正在開發一個屏幕,我有一個JTextField應該總是會收到UpperCase值。看,我剛剛創建了一個派生自PlainDocument的類,它在insertString中對其進行了處理。 問題是,無論何時編輯我的JTextField的值,它都會覆蓋字符串,而不是插入正在輸入的字符串值。例如:我有值「若昂·席爾瓦」在我的領域,我想添加名爲「佩德羅」不久後「若昂」和之前的「達席爾瓦」,但是當我把光標在鍵盤的位置,我想開始輸入寫入字符串得到「JoãoPedrolva」而不是「JoãoPedro da Silva」。我希望你已經明白了。 任何人都知道如何解決這個問題?我搜查了很多,嘗試了很多方法,但無法解決。java PlainDocument覆蓋值問題

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

感謝

回答

1

什麼:

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

    if (str == null) { 
     return; 
    } 

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

謝謝。但仍然相同=/UpperCase工作正常,我的問題是在插入一個新的字符中間值的時候重寫值。 –

+0

您描述的覆蓋不會發生在我身上,您的代碼也不會顯示任何會導致這種情況的內容。也許你有某種KeyListener或KeyBinding讓它像你描述的那樣行事?發佈SSCCE。 – splungebob

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

    } 
} 

對不起,我沒有時間來解釋。但是,希望你能比較時看到你做錯了什麼。