我的应用程序中有一个文本字段。尽管它是一个文本字段,但用户有时会在其中粘贴大量文本。此外,问题的其他功能也设置了大量。
有时,由于文本过多,JVM 在 fontmanager.dll 中发生访问冲突。 Oracle 似乎对解决问题本身不感兴趣,所以我想至少尽量避免它。
限制用户输入的文本量显然是 Not Acceptable (否则这将是最明显的解决方案)但允许设置它然后禁用文本字段是可以接受的。当文本绑定(bind)回模型时,它应该再次包含全文。
由于这本质上是 View 中的错误,我认为应该在 View 中进行修复,而不是在模型中解决它并在其中添加其他属性。
我的第一次尝试是这样的:
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 没有绑定(bind)到文本属性,而是绑定(bind)到 Document,模拟文本属性。所以实际上 getText() 在该测试中总是返回一个空字符串。
我现在正在考虑尝试制作一个 Document 实现,它将执行我想要的操作,但在文档级别执行这种技巧肯定不容易。我可以看到它拥有的所有方法,但我找不到一种好的方法来限制文本,同时在调用 getText() 时不使该文本不可用。
最佳答案
毫无疑问,这是一个艰难的过程。除了不尝试渲染太多文本之外,您希望以最小的影响来影响字段的绘制。我唯一的建议是考虑创建自己的绘画策略(请参阅 http://forums.sun.com/thread.jspa?threadID=481290),在绘制文本的位置,只绘制字符的子集。您可以考虑尝试构建一个新的 UIDelegate 来绘制文本组件,但这也可能非常困难。这painting overview可能有助于指导您进行定制绘画。这article可能会帮助您了解如何在所有文本字段或您尝试更正的文本字段中应用自定义 UI 委托(delegate)。
关于java - 我可以限制可以绘制的 JTextField 中的文本长度,同时仍然存储全文吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3411993/