如何为其模型中文本的不同代码点自定义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,每个组件都有一个 Controller、Model 和 View。特别是JTextField
使用PlainDocument
作为模型来获取数据,并使用TextUI
作为视图来呈现数据。 JavaDoc 中的链接:JavaDoc JTextComponents MVC.
通常JTextField
的数据是 text 并且对于文本的每个字符,Java 使用一个 code-point 并且称为 GlyphView
的东西会将它们呈现给查看JtextField
的文本。有一些字符被称为 non-printable(如 Unicode 中的 \u0000
),JTextField
不会呈现它们。
我尝试使用PlainDocument
更改模型,以使用String
的replaceAll()
方法将文本字符串中的不可打印字符替换为可打印字符:
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
更改模型,以使用String
的replaceAll()
方法将文本字符串中的不可打印字符替换为可打印字符。这种方法的第一部分是正确的,我们必须扩展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 模型启用自定义容器
如何为状态 UIControlStateHighlighted 设置按钮标签文本颜色
如何为 keras 模型使用 tensorflow 自定义损失?
如何为来自 SpringBoot 后端代码的嵌套 JSON 响应在 angular8(TypeScript) 或更高版本中定义模型类