6

我有一个 SWING GUI 类,它为显示的一部分实例化一个自定义 JPanel。这个自定义类具有按钮和文本字段等。拥有自定义 JPanel 的我的 GUI 类也有一个控制器类,用于处理我的数据模型的修改。如何将自定义面板中的操作传递给它的所有者(我的 gui 类)来处理事件?

我曾想过,也许我可以在自定义面板的构造函数中添加对 gui 中的控制器类的引用,以便我可以将其设置为按钮上的 actionListener。这种方法是否可取?有更好的方法吗?

4

2 回答 2

4

您的View代码(您的自定义JPanel)应该有一个Controller字段(或获取控制器类的其他方式)。这样,当您收到来自用户的操作(例如鼠标单击按钮)时,您可以调用controller.doTheAppropriateAction(). 要么在构造时传入,要么Controller在其上使用 Javabean 设置器模式,并在构造之后在启动逻辑中设置它(这听起来像你的“GUI 类”)。我更喜欢 Javabean 模式,因为 GUI 编辑器需要无参数构造函数。

您应该将您View的注册为Listener相关Controller(或Model)类,以便在发生任何变化时自动通知您 - 这样您就可以使用repaint()Component的 s(或做一些更高级的事情)。这将涉及在(或)中设置您自己的interface(用于View实现)和侦听器处理逻辑。ControllerModel

Lombok PG从后者中取出样板。

akf提供了另一种选择:将您的注册ControllerActionListener您的View代码。这种方法的优点是您的View代码不会被绑定到特定的Controller- 但缺点是您Controller将被绑定到您的View代码。Controller我倾向于为不同的 UI 实现(例如 Swing、GWT、JSP)重用代码,因此我Controller的 s 和Models 永远不会依赖于任何特定的View或原子的用户操作。

于 2012-08-03T23:35:15.893 回答
2

您可以将对父 GUI 的引用作为ActionListener自定义面板传递。然后,您的自定义面板可以使用您ActionListener的所有按钮等注册您的 -implementing 父类。

然后,您的父类将收到有关每个操作的通知。

于 2012-08-03T23:38:10.370 回答