我是否可以限制可以绘制的JTextField中的文本长度,同时仍然存储全文?

Tre*_*kaz 5 java swing limit 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这确实传递了天真的单元测试,但是一旦我为BeansBinding编写了一个额外的测试,我发现它不起作用,因为BeansBinding不绑定到text属性,而是绑定到Document,模拟文本属性.所以实际上getText()总是在该测试中返回一个空字符串.

我现在正在尝试制作一个可以实现我想要的文档实现,但在文档级别做这种技巧肯定不容易.我可以看到它拥有的所有方法,但是我无法找到一种限制文本的好方法,而不会在调用getText()时使该文本不可用.

Pau*_*ett 1

毫无疑问,这是一项艰难的任务。除了不尝试渲染太多文本之外,您还希望以最小的影响来影响字段的绘制。我唯一的建议是创建自己的绘画策略(请参阅http://forums.sun.com/thread.jspa?threadID=481290)以及绘制文本的位置,只需绘制字符的子集。您可以考虑尝试构建一个新的 UIDelegate 来绘制文本组件,但这也可能非常困难。此绘画概述可能有助于指导您进行自定义绘画。本文可能会帮助您了解如何在所有文本字段或仅在您尝试更正的文本字段中应用自定义 UI 委托