Java Swing 设计 : static vs instance

标签 java swing

我设计了一个 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合理改进的“超前思考”示例

  • 这会处理一次打开的多个 JFrame 吗?是的。
  • 这是否会处理单个 JFrame,但有多个文档(例如,文本文档的选项卡式界面)?几乎。该方法必须更聪明一点才能知道许多文档中的哪个处于 Activity 状态,但您可以很容易地想象这样做。
  • 当我需要保存更多关于 dicument 的信息时怎么样,比如名称(所以 Save 给出了一个很好的默认值),最后一次保存,它是否“脏”,它是 HTML 还是 XHTML 或其他什么......此时,您可能想要再添加一个模型层。但是你可以想象一下,再多一层间接(多一个链接)就可以了。因此,这取决于您与实现#3 的设计方式有多接近。
  • 关于Java Swing 设计 : static vs instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8761954/

    相关文章:

    java - TreeCellEditor 在编辑单元格后执行操作

    java - Azure IoT 中心 Java SDK 是否支持 X.509 证书?

    java - 在 JEditorPane 中获取可见文本

    java - 多用户聊天中的 smack 状态监听器

    Java Swing - 如何从另一个 JPanel 访问一个 JPanel 的 JComponent,两者都添加到 JFrame?

    java - MarkLogic sem : function group in MarkLogic Java API

    java - 如何在 Swing 中显示打印进度对话框?

    Java 等待线程完成

    java - 如何设置可选择的JRadioButton的数量

    java - 如何使GUI客户端在java中上传文件