作为Java Swing的新手,我在将用户界面逻辑与域逻辑分离时遇到了一些麻烦。
我有一个包含JLabel,JTextField和JButton的JFrame的小型(普通?)Swing应用程序。按下JButton时会弹出一个JFileChooser对话框。选择文件后,JTextField包含文件的绝对路径。到目前为止还没有什么壮观的景象。 接下来我想要完成的是将文件的绝对路径“注入”文件管理器类,该类将在进行选择并更新JTextField时处理文件的实际处理(每次选择文件时)使用JButton)。
我的问题:
该应用程序分为几个包:
我希望我足够清楚......
提前感谢清理事宜。
答案 0 :(得分:4)
就个人而言,当我处理这些问题时,我会尝试将可重用性和责任(谁负责什么)视为主要要求。
也就是说,我尝试将我的模型设置在这样的位置,这样他们就不关心数据来自或去往的方式和位置,它们只是提供了接口访问以实现它。
要将所有元素连接在一起,我依靠模型将事件提供给客户端,因为模型不应该关心谁想知道,只需提供所需的功能。所以,为了向客户提供反馈,我会依赖一系列的听众。
我会将监听器分解为特定的工作,例如文件读取的通知将是它自己的监听器,对模型的更改(添加/删除/更新)文件bean将是另一个。其他通知需要不同的监听器,这使您无法创建实际上并不想了解的怪物监听器。
对于在模型中设置值,我会在属性设置器/ getter一侧犯错。这会将您的模型与实现分离(如果您以自动方式使用模型,该怎么办?)
如果可能,内部数据最好由模型管理。也就是说,如果更改模型正在管理的文件bean上的属性,则模型应该能够监视更改并处理它。话虽如此,您可能希望将来某个时候使用哑模型,您可以批量更新一系列文件bean,然后让模型自行更新。
我个人可能会提供模型在外部更新的方法,同时提供至少一个能够提供自我监控的实现,这使您可以灵活地为正确的情况选择正确的模型。
此处还存在内存泄漏的危险。如果在不再需要文件bean时没有从文件bean中正确删除任何侦听器,最终可能会阻止该bean在以后被垃圾回收。
尽可能使用接口。当试图将这些模型组合在一起时,这提供了很大的灵活性。
对于您所描述的内容,我将允许文件管理器负责文件管理器,以便文件管理器成为文件bean的容器。
取决于项目的大小以及将来如何重用代码将极大地影响代码的布局。
我通常将UI代码放在UI包和子包中,但那只是我。我倾向于将界面内容与实现内容分开(通常在物理上在单独的Jar文件中,但同样,那就是我)。这意味着我只需要包含接口库以及我可能正在使用的实现,使用某种工厂来实际实例化实现(如果需要)(或直接根据需要)。以JDBC驱动程序为例。
你想要看看球体的责任。根据您的描述,我觉得文件bean属于文件管理器的责任范围,因此我将两者绑定在一起。
这只是我的观点
答案 1 :(得分:4)
以下是一些建议:
使用SwingWorker
,图示为here,在听取进度的同时保持GUI生动。
使用图示here的Action
来封装功能。
使用File
,一种方便的跨平台抽象。用它来组合新的抽象,而不是拉出非跨平台的部分。
附录:另请参阅A Swing Architecture Overview和answer。