Java 我是否可以限制JTextField中可以绘制的文本长度,同时仍然存储全文?
我的应用程序中有一个文本字段。尽管它是一个文本字段,但用户有时会将大量文本粘贴到其中。此外,问题集的其他功能也会大量使用 有时文本太多,JVM在fontmanager.dll中遇到访问冲突。Oracle似乎对解决问题本身不感兴趣,所以我想至少尽量避免它 限制用户输入的文本量显然是不可接受的(否则这将是最明显的解决方案),但允许设置文本量,然后禁用文本字段是可以接受的。当文本绑定回模型时,它应该再次包含全文 由于这在视图中本质上是一个bug,我认为修复应该在视图中,而不是在模型中解决它并在那里添加额外的属性 我的第一次尝试是这样的:Java 我是否可以限制JTextField中可以绘制的文本长度,同时仍然存储全文?,java,swing,limit,jtextfield,Java,Swing,Limit,Jtextfield,我的应用程序中有一个文本字段。尽管它是一个文本字段,但用户有时会将大量文本粘贴到其中。此外,问题集的其他功能也会大量使用 有时文本太多,JVM在fontmanager.dll中遇到访问冲突。Oracle似乎对解决问题本身不感兴趣,所以我想至少尽量避免它 限制用户输入的文本量显然是不可接受的(否则这将是最明显的解决方案),但允许设置文本量,然后禁用文本字段是可以接受的。当文本绑定回模型时,它应该再次包含全文 由于这在视图中本质上是一个bug,我认为修复应该在视图中,而不是在模型中解决它并在那里添加
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()时使文本不可用。这无疑是一个困难的方法。您希望以最小的影响影响字段的绘制,而不是试图渲染太多的文本。我唯一的建议是考虑创建自己的绘画策略(请参阅),在绘制文本的地方,只需绘制角色的子集。您可以考虑尝试构建一个新的UIDelegate来绘制文本组件,但这可能也相当困难。这可能有助于指导您进行定制绘画。这可能会帮助您在所有文本字段中应用自定义UI委托,或者仅在您试图更正的文本字段中应用自定义UI委托。您可以使用单行JTextArea,而不是使用JTextField。然后可以在文档中插入换行符。然后,当文本被绘制时,您将只看到一行
您可能还需要重写getText()方法来删除换行符。不确定它是否有帮助,但它可能会让您从另一个方向思考。有限长度文档非常容易操作。当然有几种方法,以下是最简单的方法(在我们的环境中用于生产):
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);
}
}