2013-09-26 83 views
0

我的問題是:FormattedTextField混合大小寫字符的DocumentFilter設置爲大寫

我有一個:

public class WWFormattedTextField extends JFormattedTextField implements FocusListener { 

所有在所有屏幕的格式文本框將始終是大寫。我們希望他們出現大寫同時打字等,所以這裏我們所做的事情爲:

public class WWFormattedTextField extends JFormattedTextField implements FocusListener { 

private DocumentFilter filter = new UppercaseDocumentFilter(); 
private boolean isEmail = false; 

public WWFormattedTextField() { 
    super(); 
    init(); 
} 

private void init() { 
    addFocusListener(this); 
    ((AbstractDocument) this.getDocument()).setDocumentFilter(filter); 
} 
public void setIsEmail(boolean email) { 
    //Normally this is where I would put something like 
    //if email is true - allow mixed case characters 
    this.isEmail = email; 
} 

public boolean getIsEmail() { 
    return isEmail; 
} 

現在,所有的所有屏幕上WWFormattedTextFields的大寫字符類型。 這裏是UppercaseDocumentFilter()前面提到:

public class UppercaseDocumentFilter extends DocumentFilter{ 
    @Override 
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException { 
     fb.insertString(offset, text.toUpperCase(), attr); 
    } 

    @Override 
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
     fb.replace(offset, length, text.toUpperCase(), attrs); 
    } 
} 

正如你可以看到,這個FormattedTextField也有一個ISEMAIL屬性。當這個值爲真時 - 我想讓用戶輸入混合大小寫字符到字段中,但只有特定的字符。

任何提示/建議我如何做到這一點?

回答

1

isEmail屬性添加到UppercaseDocumentFilter,使特定的過濾器可產生大寫文字

public class UppercaseDocumentFilter extends DocumentFilter { 

    private boolean isEmail; 

    public UppercaseDocumentFilter(boolean isEmail) { 
     this.isEmail = isEmail; 
    } 

    @Override 
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException { 
     fb.insertString(offset, isEmail? text: text.toUpperCase(), attr); 
    } 

    @Override 
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
     fb.replace(offset, length, isEmail? text: text.toUpperCase(), attrs); 
    } 
} 

然後設置過濾器這樣

DocumentFilter filter = new UppercaseDocumentFilter(isEmail); 
((AbstractDocument) this.getDocument()).setDocumentFilter(filter); 
+0

感謝您的回答,@Reimeus!也許我誤解了代碼的使用,但現在我的所有文本字段都是混合大小寫,而不管isEmail是真是假。你能否稍微闡述一下?我看到UppercaseDocumentFilter的邏輯,但不確定TextField類應該發生什麼變化。 –

+0

我懷疑你正在設置'isEmail'標誌_after_文本域已被創建。這不會因爲你只是設置'isEmail'標誌而起作用。你需要調用['setDocument'](http://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html#setDocument(javax.swing.text.Document))if情況就是如此 – Reimeus

相關問題