黑马程序员技术交流社区

标题: 复习GUi遇到的问题 [打印本页]

作者: 江南    时间: 2012-6-12 13:53
标题: 复习GUi遇到的问题
下面代码是鼠标进入按钮时记录进入次数:
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++)+"次");
                                }
                        });
                }
        }
为什么会这样?
作者: 唐志兵    时间: 2012-6-12 14:01
本帖最后由 唐志兵 于 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. //然后程序运行到这里的时候会出栈,然后你的变量生命周期结束。 下一次鼠标访问的时候又会压入一个新的变量到堆栈中。

复制代码

作者: 杨天皓    时间: 2012-6-12 14:01
这肯定是必然的啊。
你知道每次鼠标在放上去的时候,他都是触发了你mouseEntered这个事件。

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

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

就这个问题而言,你点击鼠标时就会侦听到触发事件,cout记录为1,然后执行mouseEntered操作。以后的点击以此类推。
而你把记录的次数放在mouseEnterd中,相当于每次执行操作时都把侦听到的事件记录cout为1,所以肯定每次都会打印出1.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2