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