用Java实现模型和视图分离的文本编辑器

用Java实现模型和视图分离的文本编辑器,java,swing,text,text-editor,jtextpane,Java,Swing,Text,Text Editor,Jtextpane,我想用java实现一个文本编辑器,其中文本区域的模型和视图是完全分离的,文本的某些部分是“计算的”。我浏览了文档和Java编辑器工具包的一些示例,文档和文档过滤器,但我仍然对这个主题迷茫 简而言之,我想做的是一个文本编辑器,其中匹配模式的某些单词(例如:ID123456)将与匹配文本中id引用的对象的另一个属性交换。但是,这种交换应该只在视图中发生,当修改或保存文本区域时,应该保存原始文本,而不是为视图投影的文本。当然,在这种情况下,投影文本无法更改,但这可以通过DocumentFilter轻松

我想用java实现一个文本编辑器,其中文本区域的模型和视图是完全分离的,文本的某些部分是“计算的”。我浏览了文档和Java编辑器工具包的一些示例,文档和文档过滤器,但我仍然对这个主题迷茫

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

让任务更清晰的示例:

文本编辑器后面的模型:

ID123真的拥有世界上最大的铝土矿产量吗

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

用户应该看到的内容:

比利时是世界上铝土矿产量最大的国家吗

不,这不是真的,澳大利亚的铝土矿产量最大


我目前正在考虑编写一个解析器,在每次需要时进行这种转换,但我并不真正喜欢这种解决方案。如果您能提供任何帮助,我们将不胜感激。

模型和视图在JTextComponent中分开。您有一个作为模型的文档,以及呈现该文档的视图。如果您真的坚持您的方法,那么应该使用一个JTextPane,它后面有一个视图,您可以用自己的视图工厂替换它

然而,我不推荐这种方法。您不想更改文档的呈现方式。您只需要在呈现文档之前解释文档的某些部分。因此,您需要的是一个翻译人员,在阅读文档时将
ID123
翻译成
belligen
,在写作时将
belligen
翻译成
ID123


为此,需要在双向映射()中映射值。然后,您需要覆盖您的

读取
写入
方法。我认为您需要覆盖EditorIt的读取/写入方法,并添加您自己的读写器(具体取决于您扩展的EditorIt)

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


在写的时候做相反的事情。检查文本元素是否指定了MyCustomId属性。如果属性存在,则写入值而不是元素文本。

是否要查找?
模型和文本区域视图完全分开的地方
为什么需要将它们分开?在文档外部保持“原始”文本完好无损的同时,还有其他替换方法(例如DocumentFilter替换为文档并保持原始(或委托给存储原始的类))谢谢,这非常有效!实际上,我使用了您的帮助来帮助我实现。但在实现之后,我发现了RSyntaxTextArea,这使它变得更加简单,非常方便。