有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

简而言之,我想做的是一个文本编辑器,其中匹配模式(例如: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.

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


共 (2) 个答案

  1. # 1 楼答案

    我认为您需要覆盖EditorKit的读/写方法,并添加您自己的读写器(确切的读写器取决于您扩展的EditorKit)

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

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

  2. # 2 楼答案

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

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

    为此,您需要在双向映射(this one for instance)中映射您的值。然后,需要重写EditorKitreadwrite方法