Java事件监听器

时间:2018-02-17 00:40:14

标签: java events event-listener

我有一些关于Java事件监听器的问题...我有一些经验,但在学校我学习其他方式,我不得不问...这里是代码

 lbl.addMouseListener(new MouseAdapter(){

      public void mouseClicked(MouseEvent e){

           ((Label)e.getComponent()).setText("Mouse clicked");

       }});

为什么我需要使用" e.getComponent"当我知道是" lbl" ...我尝试没有并以相同的方式工作......

 lbl.setText("Mouse clicked");

 whatEverLbl.setText("someText");

在我使用它之前" e.getSource"当我为多个按钮制作一个方法时......比如

  

if((e.getSource)==" testButton")....

但为什么我在之前的例子中需要... 并且是" e.getSource"和" e.getComponent"是相同的......或者相同,因为我尝试了两者都是有效的......

如果我犯了咒语错误......

1 个答案:

答案 0 :(得分:1)

首先,先看看MouseEvent#getComponent。它只返回Component。所以无论你知道什么,编译器都不知道事件的来源是什么"可能"是

请记住,这些API是在泛型和内部/匿名类支持可用之前设计的,因此所有侦听器接口都可以由类本身或单独的类实现。

  

并且是" e.getSource"和" e.getComponent"是相同的

您需要做的另一个考虑因素是,您可能有一个监听器负责监视多个组件,为每个组件执行专门(或常见)任务。

  

为什么我需要使用" e.getComponent"当我知道是" lbl" ...我尝试没有并以相同的方式工作......

好的,这又归结为这样一个事实:侦听器API会对语言进行一些更改,包括泛型,内部/匿名类以及编译器处理从匿名类引用的局部变量的方式的更改(或者更重要的是,开发人员不再需要将其标记为final

的方式

所以,采取"大多数"考虑到这一点:

  • 如果匿名侦听器附加到实例字段,那么说您自己使用实例字段
  • 是公平的。
  • 如果匿名侦听器附加到实例字段,您可以考虑使用局部变量,但是,如果局部变量是在循环中创建的,那么使用事件的源代码会更安全,因为它消除你心中的任何歧义
  • 如果监听器是在类级别或通过单独的类(甚至是内部类)实现的,那么直接使用事件的源会更安全,因为监听器可能正在监视许多不同的组件