我有一个扩展JFrame并构成程序GUI的类。我想将GUI用于两个主要目的:
考虑到我的类有很多GUI元素,源文件已经相当大了,将所有程序代码与GUI代码捆绑在一起似乎不太好。我想知道构建代码的最佳方法是什么?我相信有一个问题,其中需求1创建了从GUI到程序代码的依赖关系,而第二个要求恰恰相反。
所以,我想要一个用于GUI的类,其中包含我所有与GUI相关的任务。然后我想要另一个类用于我的程序逻辑。然后我应该能够从GUI调用程序逻辑类中的方法,反之亦然。
答案 0 :(得分:4)
听起来您正在寻找教科书MVC(模型 - 视图 - 控制器)设计模式。我推荐你谷歌“MVC设计模式”的摘要和用例。话虽这么说,您可能希望将您的程序逻辑放入“Singleton”类(再次,谷歌“Singleton设计模式”)。可以从代码中的任何其他类访问正确实现的Singleton。
还要考虑第三个中间类,它仅用于数据存储,您将值放入存储中,然后从中获取值以进行工作。现在,这为您的代码创建了3个明确的段,数据(模型),GUI(视图)和逻辑(控制器)。瞧,你刚刚实现了MVC(模型 - 视图 - 控制器)设计模式......
答案 1 :(得分:2)
业务逻辑不应该依赖于GUI逻辑。
让您的GUI接收用户的输入。使用这些输入作为方法参数调用业务逻辑方法,并使用方法返回的值在GUI中显示结果。因此,GUI取决于业务逻辑,但反之则不然。
如果业务逻辑必须回调GUI,它应该通过定义良好的GUI无关的回调接口或监听器来实现。例如,您可以在某个业务逻辑对象上注册ProgressListener,此对象将回调进度监听器。 GUI将具有ProgressListener的实现,其实际上将更新一些进度条或文本区域。但业务逻辑仅取决于接口,而不取决于具体实现。
答案 2 :(得分:2)
我不确定是否有一种“最好”的方法来构建GUI代码。但是,作为一般规则,您应该遵循MVC。您的程序(型号)永远不会直接依赖于您的View代码。允许做的是通知控制器模型(或其部分)发生变化,并且当前正在显示模型的所述部分的任何视图都应该更新。
Swing已经为它的某些类型的组件提供了这个抽象层,大多数类(有些令人困惑)后缀为Model
。您可以看到的一个简单示例是BoundedRangeModel
。对于程序管理的每个“单位”数据,应该只有一个这样的模型实例,显示此数据的不同视图应该共享此实例。您的业务代码管理此对象,每当此数据更改时,都会通过触发某些事件侦听器来通知GUI。