如何为其模型中文本的不同代码点自定义Java 9+ JTextField的视图?

Posted

技术标签:

【中文标题】如何为其模型中文本的不同代码点自定义Java 9+ JTextField的视图?【英文标题】:How to customize the View of Java 9+ JTextField for different code-point of the text in its Model? 【发布时间】:2020-08-09 20:01:17 【问题描述】:

所有 Java Swing 组件都使用 MVC,每个组件都有一个 ControllerModelView。特别是JTextField 使用PlainDocument 作为模型来获取数据,并使用TextUI 作为视图来呈现数据。 JavaDoc 中的链接:JavaDoc JTextComponents MVC. 通常JTextField 的数据是 text 并且对于文本的每个字符,Java 使用一个 code-point 并且称为 GlyphView 的东西会将它们呈现给查看JtextField 的文本。有一些字符被称为 non-printable(如 Unicode 中的 \u0000),JTextField 不会呈现它们。 我尝试使用PlainDocument 更改模型,以使用StringreplaceAll() 方法将文本字符串中的不可打印字符替换为可打印字符:

protected class TextModel extends PlainDocument


    TextModel()
    

    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
    
        str = str.replaceAll("\u0000", "\ufffd");
        super.insertString(offs, str, a);
    


但我不想对 String 进行任何处理或对 Model 进行任何更改。如何更改JTextField 的视图以呈现不可打印的字符?

【问题讨论】:

【参考方案1】:

正如我所说,我尝试使用PlainDocument 更改模型,以使用StringreplaceAll() 方法将文本字符串中的不可打印字符替换为可打印字符。这种方法的第一部分是正确的,我们必须扩展PlainDocument,但我没有覆盖insertString() 方法,而是使用getText(int offset, int length, Segment txt) 方法来覆盖它。 此方法获取包含在文档给定部分中的文本,该部分从offset 开始并具有指定的length。具有数组的Segment 起重要作用。所需的更改必须应用于Segment。使用共享双缓冲区,我可以将任何不可打印字符映射到 JTextField 中的可打印字符,而无需更改其数据,如下所示:

@Override
    public void getText(int offset, int length, Segment txt) throws BadLocationException
    
        super.getText(offset, length, txt);

        System.arraycopy(txt.array, txt.offset, sharedDoubleBuffer.array, sharedDoubleBuffer.offset, sharedDoubleBuffer.count);
         // map nonprintable characters 
        charMappingLogic(sharedDoubleBuffer);
        // set contents of the supplied buffer to that of our modified shared double-buffer
        txt.array = sharedDoubleBuffer.array;
    

【讨论】:

以上是关于如何为其模型中文本的不同代码点自定义Java 9+ JTextField的视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Scoped Allocator 模型启用自定义容器

如何为 Django 模型定义默认数据?

如何为状态 UIControlStateHighlighted 设置按钮标签文本颜色

如何为 keras 模型使用 tensorflow 自定义损失?

如何为来自 SpringBoot 后端代码的嵌套 JSON 响应在 angular8(TypeScript) 或更高版本中定义模型类

如何为 DOM 中的每个元素添加不同的文本