在 Java 中实现具有单独模型和视图的文本编辑器
Implementing text editor with seperate model and views in Java
我想在 java 中实现一个文本编辑器,其中文本区域的模型和视图是完全独立的,文本的某些部分是“计算的”。我浏览了 Java 编辑器工具包 Document 和 DocumentFilter 的文档和一些示例,但我仍然对这个主题一头雾水。
简而言之,我想做的是一个文本编辑器,其中某些与模式匹配的单词(例如:ID123456)将与匹配文本中 id 引用的对象的另一个 属性 交换。这种交换应该只发生在视图中,当文本区域被修改或保存时,原始文本应该被保存而不是为视图投影的文本。当然在这种情况下无法更改投影文本,但这可以使用 DocumentFilter 轻松处理。
一个让任务更清晰的例子:
文本编辑器背后的模型:
Is it true that ID123 has the largest bauxite production of the world?
No, it's not true, ID44 has the largest bauxite production.
用户应该看到的内容:
Is it true that Belgium has the largest bauxite production of the world?
No, it's not true, Australia has the largest bauxite production.
我目前正在考虑编写一个每次需要时都执行此转换的解析器,但我不太喜欢这个解决方案。任何帮助将不胜感激,因为这样做的最佳方式是什么。
模型和视图在 JTextComponent 中 是分开的。您有一个作为模型的文档和呈现文档的视图。如果你真的坚持你的方法,你应该使用一个 JTextPane 支持 EditorKit 在那里你用你自己的一个替换了 ViewFactory。
但是,我不推荐这种方法。您不想更改文档呈现的方式。您只想在呈现文档之前解释文档的某些部分。所以你需要的是一个翻译器,阅读文档时将ID123
翻译成Belgium
,写作时将Belgium
翻译成ID123
为此,您需要在双向映射中映射您的值(例如这个)。然后,您需要覆盖 EditorKit
的 read
和 write
方法
我认为您需要覆盖 EditorKit 的 read/write 方法并添加您自己的 reader 和 writer(具体取决于您扩展的 EditorKit)。
读取时将 ID 放在字符元素的属性中,例如MyCustomId=ID123 并将其存储在模型中。元素的文本实际上应该替换为相应的值(在我们的例子中是国家/地区)。
写入时做相反的事情。检查文本元素是否指定了 MyCustomId 属性。如果属性存在,请写入值而不是元素文本。
我想在 java 中实现一个文本编辑器,其中文本区域的模型和视图是完全独立的,文本的某些部分是“计算的”。我浏览了 Java 编辑器工具包 Document 和 DocumentFilter 的文档和一些示例,但我仍然对这个主题一头雾水。
简而言之,我想做的是一个文本编辑器,其中某些与模式匹配的单词(例如:ID123456)将与匹配文本中 id 引用的对象的另一个 属性 交换。这种交换应该只发生在视图中,当文本区域被修改或保存时,原始文本应该被保存而不是为视图投影的文本。当然在这种情况下无法更改投影文本,但这可以使用 DocumentFilter 轻松处理。
一个让任务更清晰的例子:
文本编辑器背后的模型:
Is it true that ID123 has the largest bauxite production of the world?
No, it's not true, ID44 has the largest bauxite production.
用户应该看到的内容:
Is it true that Belgium has the largest bauxite production of the world?
No, it's not true, Australia has the largest bauxite production.
我目前正在考虑编写一个每次需要时都执行此转换的解析器,但我不太喜欢这个解决方案。任何帮助将不胜感激,因为这样做的最佳方式是什么。
模型和视图在 JTextComponent 中 是分开的。您有一个作为模型的文档和呈现文档的视图。如果你真的坚持你的方法,你应该使用一个 JTextPane 支持 EditorKit 在那里你用你自己的一个替换了 ViewFactory。
但是,我不推荐这种方法。您不想更改文档呈现的方式。您只想在呈现文档之前解释文档的某些部分。所以你需要的是一个翻译器,阅读文档时将ID123
翻译成Belgium
,写作时将Belgium
翻译成ID123
为此,您需要在双向映射中映射您的值(例如这个)。然后,您需要覆盖 EditorKit
的read
和 write
方法
我认为您需要覆盖 EditorKit 的 read/write 方法并添加您自己的 reader 和 writer(具体取决于您扩展的 EditorKit)。
读取时将 ID 放在字符元素的属性中,例如MyCustomId=ID123 并将其存储在模型中。元素的文本实际上应该替换为相应的值(在我们的例子中是国家/地区)。
写入时做相反的事情。检查文本元素是否指定了 MyCustomId 属性。如果属性存在,请写入值而不是元素文本。