Java gui程序中哪个类更适合处理事件?

Java gui程序中哪个类更适合处理事件?,java,swing,event-handling,awt,Java,Swing,Event Handling,Awt,我被这几行代码弄糊涂了: public class AL extends Frame implements WindowListener,ActionListener { Button b; b = new Button("Click me"); b.addActionListener(this); ... 我的理解是,框架被设置为“its”按钮的事件处理程序。 设置事件处理程序本身是gui的一部分,而与事件源分离,这是否可以接受?(我的意思是,按钮类可能应该处理其事件。) 正如我所看到的,代

我被这几行代码弄糊涂了:

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()

此外,作为类的方法处理事件的GUI类往往会超出比例,不幸的是,数千行代码的类是我在不同的项目和公司中多次看到的

不要落入这个陷阱。保持您的类简短,为每个内部组件使用不同的类,除非它是具有非常简单初始化的常规组件(在这种情况下,最好使用factory类进行初始化)

当处理程序中的代码行很少时,将事件处理保留在匿名类中;当代码行数超过一两行时,将事件处理保留在单独的类中


简而言之,GUI代码与其他OO代码没有什么不同,应该遵循相同的原则和方法。

“我被这些代码弄糊涂了:
公共类AL扩展框架实现了WindowListener,ActionListener{..
”放弃整个源代码,这不是好的代码学习。1)它使用AWT而不是Swing。关于放弃使用AWT组件的许多好理由,请参阅我的答案。(Swing框架还有一个默认的关闭操作,比WindowListener更易于使用。
2)它扩展了
Frame
。更喜欢组合而不是继承。3)它声明了一个类级别的操作侦听器,其中可能有匿名的内部类或
action
实例。4)它对类使用了一个糟糕的名称。顺便说一句-该代码的任何部分都不是Swing。它都是AWT。