在Java Swing中将域与用户界面分开

时间:2012-07-16 22:57:25

标签: java swing layer 3-tier code-separation

作为Java Swing的新手,我在将用户界面逻辑与域逻辑分离时遇到了一些麻烦。

我有一个包含JLabel,JTextField和JButton的JFrame的小型(普通?)Swing应用程序。按下JButton时会弹出一个JFileChooser对话框。选择文件后,JTextField包含文件的绝对路径。到目前为止还没有什么壮观的景象。 接下来我想要完成的是将文件的绝对路径“注入”文件管理器类,该类将在进行选择并更新JTextField时处理文件的实际处理(每次选择文件时)使用JButton)。

我的问题:

  1. 如何让文件管理员知道何时开始阅读文件? (例如,计算该文件中的行数)
  2. 如何以在UI层中共享最少信息的方式实现域层?我应该向UI添加文件管理器实例吗?
  3. 我应该使用JTextField的值作为文件管理器的引用,还是应该使用JButton操作将值设置到文件管理器中?我的意思是:使用JTextField的propertychangelistener或使用JButton的actionlistener?
  4. 我应该使用filebean来存储域图层中文件的绝对路径,还是直接将其插入文件管理器?不同之处在于:当我使用属性更改侦听器时,可以在UI输入更改时更新绝对文件路径的值,但是当我使用构造函数或setter直接插入值时,我必须处理文件管理器中的更改而不是处理filebean中的更改。
  5. 如何在域逻辑中引用文件管理器中UI中使用的filebean?
  6. 域逻辑是否与业务逻辑相同?我的意思是:文件管理器类应该是package.b-logic和filebean类应该在package中包含what.domain ??
  7. 该应用程序分为几个包:

    • 无论如何:主要课程
    • whatever.presentation:swing stuff
    • whatever.domain:data stuff
    • whatever.logic:应用程序逻辑

    我希望我足够清楚......

    提前感谢清理事宜。

2 个答案:

答案 0 :(得分:4)

就个人而言,当我处理这些问题时,我会尝试将可重用性和责任(谁负责什么)视为主要要求。

也就是说,我尝试将我的模型设置在这样的位置,这样他们就不关心数据来自或去往的方式和位置,它们只是提供了接口访问以实现它。

要将所有元素连接在一起,我依靠模型将事件提供给客户端,因为模型不应该关心谁想知道,只需提供所需的功能。所以,为了向客户提供反馈,我会依赖一系列的听众。

我会将监听器分解为特定的工作,例如文件读取的通知将是它自己的监听器,对模型的更改(添加/删除/更新)文件bean将是另一个。其他通知需要不同的监听器,这使您无法创建实际上并不想了解的怪物监听器。

对于在模型中设置值,我会在属性设置器/ getter一侧犯错。这会将您的模型与实现分离(如果您以自动方式使用模型,该怎么办?)

如果可能,内部数据最好由模型管理。也就是说,如果更改模型正在管理的文件bean上的属性,则模型应该能够监视更改并处理它。话虽如此,您可能希望将来某个时候使用哑模型,您可以批量更新一系列文件bean,然后让模型自行更新。

我个人可能会提供模型在外部更新的方法,同时提供至少一个能够提供自我监控的实现,这使您可以灵活地为正确的情况选择正确的模型。

此处还存在内存泄漏的危险。如果在不再需要文件bean时没有从文件bean中正确删除任何侦听器,最终可能会阻止该bean在以后被垃圾回收。

尽可能使用接口。当试图将这些模型组合在一起时,这提供了很大的灵活性。

对于您所描述的内容,我将允许文件管理器负责文件管理器,以便文件管理器成为文件bean的容器。

取决于项目的大小以及将来如何重用代码将极大地影响代码的布局。

我通常将UI代码放在UI包和子包中,但那只是我。我倾向于将界面内容与实现内容分开(通常在物理上在单独的Jar文件中,但同样,那就是我)。这意味着我只需要包含接口库以及我可能正在使用的实现,使用某种工厂来实际实例化实现(如果需要)(或直接根据需要)。以JDBC驱动程序为例。

你想要看看球体的责任。根据您的描述,我觉得文件bean属于文件管理器的责任范围,因此我将两者绑定在一起。

这只是我的观点

答案 1 :(得分:4)

以下是一些建议:

  • 使用SwingWorker,图示为here,在听取进度的同时保持GUI生动。

  • 使用图示hereAction来封装功能。

  • 使用File,一种方便的跨平台抽象。用它来组合新的抽象,而不是拉出非跨平台的部分。

附录:另请参阅A Swing Architecture Overviewanswer