我被这几行代码弄糊涂了:
public class AL extends Frame implements WindowListener,ActionListener {
Button b;
b = new Button("Click me");
b.addActionListener(this);
...
我所理解的是框架被设置为"its"按钮的事件处理程序。是否可以将事件处理程序本身设置为gui的一部分,而与事件源分开?(我的意思是,也许按钮类应该处理它的事件。)正如我所见,代码中的许多事件都是由jframe处理的。这背后有什么特殊的目的吗?之前感谢您的时间!
之所以会看到这样的代码(我承认我也见过很多这样的代码),是因为一些程序员,特别是那些编写AWT和/或Swing代码的程序员,倾向于将大量GUI逻辑放入单个类中。造成这种情况的原因各不相同,但有几个常见的原因是:
- 他们在学习 时已经在示例中看到过这样的代码
- 他们不愿意使用匿名类,或者可能在事件侦听器的方法中有太多代码,匿名类似乎不适用
- 他们认为,如果所有子组件的事件处理都直接在父容器的方法中完成,代码会"更容易"理解
- 他们害怕在项目中有"太多的课程"(我想找到谁开始了这个误解!)
根据我的经验,很多GUI代码看起来都是这样的。这是一种好的编程方式吗?绝对不行!
你读过的任何一本方法论书都会告诉你同样的事情。这样的类打破了优秀设计的所有可能原则。最基本的例子是SRP (http://en.wikipedia.org/wiki/Single_responsibility_principle)。
此外,将事件处理为类的方法的GUI类往往会超出比例,不幸的是,我在不同的项目和公司中多次看到过数千行代码的类。
不要落入这个陷阱。保持类的简短,为每个内部组件使用不同的类,除非它是一个具有非常简单初始化的常规组件(在这种情况下,最好还是使用工厂类进行初始化)。
当处理程序中的代码行很少时,将事件处理保持在匿名类中,当处理程序中有一两行以上的代码时,将事件处理保持在单独的类中。
简而言之,GUI代码与其他OO代码没有什么不同,并且应该遵循相同的原则和方法。