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