在Java中使用单独的模型和视图实现文本编辑器

时间:2016-06-29 14:02:46

标签: java swing text text-editor jtextpane

我想在java中实现一个文本编辑器,其中模型和文本区域的视图是完全独立的,文本的某些部分是"计算"。我浏览了文档和Java编辑器工具包的一些示例,Document和DocumentFilter,但我仍然在这个问题上迷失了方向。

简而言之,我想要做的是一个文本编辑器,其中某些匹配模式的单词(例如:ID123456)将与匹配文本中id引用的对象的另一个属性交换。此交换应仅在视图中发生,但是当修改或保存文本区域时,原始文本应保存而不是为视图投影的文本。当然,在这种情况下,投影文本无法更改,但可以使用DocumentFilter轻松处理。

使任务更清晰的一个例子:

文本编辑器背后的模型:

  

ID123是否具有世界上最大的铝土矿产量?

     

不,这不是真的,ID44拥有最大的铝土矿生产。

用户应该看到的内容:

  

比利时拥有世界上最大的铝土矿产量吗?

     

不,它不是真的,澳大利亚拥有最大的铝土矿生产。

我目前正在考虑编写一个解析器,每次需要时都会执行此转换,但我并不喜欢这个解决方案。任何帮助都将被理解为最佳方式。

2 个答案:

答案 0 :(得分:0)

模型和视图 在JTextComponent中分隔。您有一个作为模型的Document,以及一个呈现文档的Views。如果你真的坚持你的方法,你应该使用一个EditorKit支持的JTextPane,你用自己的一个替换ViewFactory。

但是,我不推荐这种方法。您不想更改文档呈现的方式。您只想在呈现文档之前解释文档的某些部分。因此,您需要的是一位翻译员,在阅读文档时将ID123翻译为Belgium,并在撰写时将Belgium翻译为ID123

为此,您需要在双向地图(this one for instance)中映射您的值。然后,您需要覆盖EditorKit

readwrite方法

答案 1 :(得分:0)

我认为您需要覆盖EditorKit的读/写方法并添加您自己的读者和编写者(具体取决于您扩展的EditorKit)。

在读取时将ID放在字符元素的属性中,例如MyCustomId = ID123并将其存储在模型中。实际上,元素的文本应该替换为相应的值(在我们的例子中是国家)。

写上对面。检查text元素是否指定了MyCustomId属性。如果属性存在,则写入值而不是元素文本。