我有一个 SWING GUI 类,它为显示的一部分实例化一个自定义 JPanel。这个自定义类具有按钮和文本字段等。拥有自定义 JPanel 的我的 GUI 类也有一个控制器类,用于处理我的数据模型的修改。如何将自定义面板中的操作传递给它的所有者(我的 gui 类)来处理事件?
我曾想过,也许我可以在自定义面板的构造函数中添加对 gui 中的控制器类的引用,以便我可以将其设置为按钮上的 actionListener。这种方法是否可取?有更好的方法吗?
我有一个 SWING GUI 类,它为显示的一部分实例化一个自定义 JPanel。这个自定义类具有按钮和文本字段等。拥有自定义 JPanel 的我的 GUI 类也有一个控制器类,用于处理我的数据模型的修改。如何将自定义面板中的操作传递给它的所有者(我的 gui 类)来处理事件?
我曾想过,也许我可以在自定义面板的构造函数中添加对 gui 中的控制器类的引用,以便我可以将其设置为按钮上的 actionListener。这种方法是否可取?有更好的方法吗?
您的View
代码(您的自定义JPanel
)应该有一个Controller
字段(或获取控制器类的其他方式)。这样,当您收到来自用户的操作(例如鼠标单击按钮)时,您可以调用controller.doTheAppropriateAction()
. 要么在构造时传入,要么Controller
在其上使用 Javabean 设置器模式,并在构造之后在启动逻辑中设置它(这听起来像你的“GUI 类”)。我更喜欢 Javabean 模式,因为 GUI 编辑器需要无参数构造函数。
您应该将您View
的注册为Listener
相关Controller
(或Model
)类,以便在发生任何变化时自动通知您 - 这样您就可以使用repaint()
您Component
的 s(或做一些更高级的事情)。这将涉及在(或)中设置您自己的interface
(用于View
实现)和侦听器处理逻辑。Controller
Model
Lombok PG从后者中取出样板。
akf
提供了另一种选择:将您的注册Controller
为ActionListener
您的View
代码。这种方法的优点是您的View
代码不会被绑定到特定的Controller
- 但缺点是您Controller
将被绑定到您的View
代码。Controller
我倾向于为不同的 UI 实现(例如 Swing、GWT、JSP)重用代码,因此我Controller
的 s 和Model
s 永远不会依赖于任何特定的View
或原子的用户操作。
您可以将对父 GUI 的引用作为ActionListener
自定义面板传递。然后,您的自定义面板可以使用您ActionListener
的所有按钮等注册您的 -implementing 父类。
然后,您的父类将收到有关每个操作的通知。