EventListeners和自定义gui组件

时间:2012-08-03 23:26:49

标签: java swing user-interface actionlistener

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

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

2 个答案:

答案 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),因此我的ControllerModel永远不会依赖于任何特定的View或原子用户行动。

答案 1 :(得分:2)

您可以将{GUI}作为ActionListener的引用传递到自定义面板。然后,您的自定义面板可以注册您的ActionListener - 实施父类以及所有按钮等。

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