2010-08-05 48 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); 
    } 
} 
相关问题