我设计了一个 html 文档编辑器,我需要一些帮助来解决其中的设计问题。问题如下——
文档编辑器由一个表面 (JFrame) 和一个菜单栏组成。在表面里面我有三个面板——一个工具面板、一个文本面板和一个状态面板(它们都是 JPanel 的扩展)。文本面板具有自定义文本 Pane (JTextPane 的扩展)。现在的问题是 - 在很多情况下,工具面板上的菜单和小部件项目需要访问 JTextPane 的底层文档模型。例如。要实现列表/段落拖动功能,标尺需要知道插入符号在文档模型中的位置,以便我可以标记需要增加左侧插入的段落。
我现在组织设计的方式是 - 表面是一个单例,因此要访问 JTextPane 内的 html 文档模型,您需要通过以下迷宫进行编码 -
给我表面 -> 转到文本面板 -> 转到文本 Pane -> 转到文本 Pane 的文档
另一种使文本 Pane 内的文档引用静态化的替代方法,以便可以直接访问它。
TextPane.getTextDocument()
此外,我正在使用的文本 Pane 中的 html 文档现在不是自定义的。所以我只是使用文本 Pane 返回的默认 HTMLDocument。虽然将来我可能不得不用更自定义的 HTMLDocument 扩展来替换它(例如实现 cusom 标签)
我是一个设计新手。一些设计大师可以对此提出一些见解/见解吗?
最佳答案
我想如果你得到 10 个回复,你就会得到 11 个答案。 :-)
首先,不需要单例。在这种情况下,这只是一种欺骗全局变量的方式。当您想要打开两个或三个文本文档时会发生什么?
您的菜单是否可以访问工具面板?由于工具面板是文本面板的兄弟,并且在 1-1 关系中(我认为?),工具面板了解文本文档(有链接)和便捷方法 getTextDocument() 有点“合理”。您的小部件了解它们的直接父级工具面板似乎是合理的。
这将是我解决问题的方式 - 对象之间的哪些联系“有意义”。您想要尽可能少的耦合,但有些地方确实需要耦合。也许我误解了您的问题,或者您的想法与我有很大不同,在这种情况下,您应该换一种方式来解决。此外,您正在对您的代码在 future 可能会如何发展做出最好的猜测。祝你好运! :-)
任何解决方案的一个大问题 - 文本文档是否更改? (例如,是否有 File->New 菜单或 File->Open 菜单?)。如果是这样,那就需要考虑了。在我的建议中,JFrame 在 File->Open 上创建文本文档,然后在 ToolBar 中更改指向它的链接。
附言MVC 纯粹主义者 - 请添加适当的模型和 Controller !我刚刚谈到了图形组件以使事情变得更简单......
pps合理改进的“超前思考”示例
关于Java Swing 设计 : static vs instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8761954/