2010-08-05 45 views
5

我在我的應用程序中有一個文本字段。儘管它是一個文本字段,但用戶有時會在其中粘貼大量文本。此外,該問題的其他功能也設置了大量。我是否可以限制可以繪製的JTextField中的文本長度,同時仍然存儲全文?

有時會有太多的文本讓JVM在fontmanager.dll中出現訪問衝突。 Oracle似乎沒有興趣解決問題本身,所以我想至少嘗試避免它。

限制用戶輸入的文本數量顯然是不可接受的(否則這將是最明顯的解決方案),但允許設置然後禁用文本字段是可以接受的。當文本被綁定回模型時,它應該再次包含全文。

由於這本質上是一個視圖中的錯誤,我認爲修復應該在視圖中,而不是在模型中解決它並在其中添加其他屬性。

我第一次嘗試又是這樣的:

public class LimitedTextField extends JTextField { 
    static final int LIMIT = 10000; 
    private String fullString; 

    @Override 
    public void setText(String text) { 
     if (text != null && text.length() > LIMIT) { 
      fullString = text; 
      setEnabled(false); 
     } else { 
      fullString = null; 
      super.setText(text); 
      setEnabled(true); 
     } 
    } 

    @Override 
    public String getText() { 
     if (fullString != null) { 
      return fullString; 
     } else { 
      return super.getText(); 
     } 
    } 
} 

這並通過天真的單元測試,但一旦我寫了一個額外的測試BeansBinding,我發現它不工作,因爲BeansBinding不綁定到文本屬性,而是綁定到文檔,模擬文本屬性。所以實際上,getText()總是在該測試中返回一個空字符串。

我現在正在考慮嘗試做一個文檔實現,它將做我想做的事情,但在文檔級別做這種技巧確實不容易。我可以看到它擁有的所有方法,但是我找不到限制文本的好方法,而不會在調用getText()時使該文本不可用。

回答

1

這是一個艱難的毋庸置疑。除了不嘗試渲染太多文字之外,您希望以最小的影響影響該字段的繪畫。我唯一的建議是看看如何創建自己的繪畫策略(請參閱http://forums.sun.com/thread.jspa?threadID=481290)以及繪製文本的位置,只需繪製字符的子集。你可以看看試圖構建一個新的UIDelegate來繪製文本組件,但這可能也很難。這painting overview可能會幫助引導你關於自定義繪畫。這article可能會幫助您如何跨所有文本字段應用自定義用戶界面代理或只是您正在嘗試更正的代理。

1

而不是使用JTextField,也許你可以使用sinlge行JTextArea。然後,您可以在文檔中插入一個換行符。然後,當文字被繪製時,您只會看到一條線。

您可能需要重寫getText()方法以刪除換行符。不知道它是否有幫助,但它可能會讓你思考一個不同的方向。

1

有限長度文件是真的很容易做。當然有幾種方式,下面是最簡單的(在我們的環境中生產):

package com.twist.ui.text.document; 

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

public class LimitedLengthDocument extends PlainDocument { 
    private static final long serialVersionUID = 1L; 

    private int limit; 

    public LimitedLengthDocument(int limit) { 
     super(); 
     this.limit = limit; 
    } 

    public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException { 
     if (str == null) 
      return; 

     // insert the string as usual. 
     super.insertString(offset, str, attr); 

     // If user tries to paste in a String that will not fit into the textfield, this approach will 
     // insert the text and remove the extra characters from the right.  

     // if resultant doc length is greater than the allowable size, truncate the document. 
     if(getLength() > limit ) 
      super.remove(limit, getLength() - limit); 
    } 
} 
相關問題