A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 江南 黑马帝   /  2012-6-12 13:53  /  1729 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面代码是鼠标进入按钮时记录进入次数:
package awtTest;
import java.awt.*;
import java.awt.event.*;
public class ListenerTest{
        /**
         * @param args
         */
        public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Frames();
        }

}
class Frames{
        private Frame f;
        private Button b;
        public Frames(){
                f=new Frame("My Frame");
                f.setBounds(333, 444, 555, 666);
                b=new Button("关闭");
                f.add(b);
                f.setLayout(new FlowLayout());
                f.setVisible(true);
                Events();
        }
        public void Events(){
                        f.addWindowListener(new WindowAdapter(){
                                public void windowClosing(WindowEvent e){
                                        System.exit(0);
                                }
                        });
                        b.addMouseListener(new MouseAdapter(){
                                int count=1;//放在这里运行正确。
                                public void mouseEntered(MouseEvent e){
                                       
                                        //当把int count=1;放到此处时,运行代码后不管鼠标进入按钮多少次都打印出:进入1次,
                                        System.out.println("进入"+(count++)+"次");
                                }
                        });
                }
        }
为什么会这样?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 唐志兵 于 2012-6-12 14:05 编辑

变量的生存周期。
  1. b.addMouseListener(new MouseAdapter(){
  2. int count=1;//放在这里运行正确 。
  3.                                  public void mouseEntered(MouseEvent e){
  4.                                          
  5.                                         //如果你把变量定义的这里的话,那么这个变量在鼠标访问按钮的时候会在堆栈中压入你的变量值。
  6.                                          System.out.println("进入"+(count++)+"次");
  7.                                  }
  8.                          }
  9. //然后程序运行到这里的时候会出栈,然后你的变量生命周期结束。 下一次鼠标访问的时候又会压入一个新的变量到堆栈中。

复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这肯定是必然的啊。
你知道每次鼠标在放上去的时候,他都是触发了你mouseEntered这个事件。

每一次触发。你都把count初始化为1.
那肯定每次打印都是1啊。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
MouseAdapter接收鼠标事件的抽象适配器类,此类存在的目的是方便创建侦听器对象。 mouseEntered(MouseEvent e)该方法是当鼠标进入组件时调用。而把count放到这个方法里面就是每次鼠标进入都重新初始化count的值,所以每次都是1
回复 使用道具 举报
把count定义成全局变量就好了,不能放在b.addMouseListener(new MouseAdapter()中,否则每次count都要置为1,也就每次都打印出:进入1次
回复 使用道具 举报
这其实是一个典型的时间监听机制的案例。(也可以从局部变量的生命周期这方面理解,就是二楼说的那样。我就不再重复了)
时间监听机制的原理就是只有当侦听器侦听到外界对事件源的触发事件时,就会做出相应的处理操作。

就这个问题而言,你点击鼠标时就会侦听到触发事件,cout记录为1,然后执行mouseEntered操作。以后的点击以此类推。
而你把记录的次数放在mouseEnterd中,相当于每次执行操作时都把侦听到的事件记录cout为1,所以肯定每次都会打印出1.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马