我通过debug调试一个程序,发现每次执行完mousereleased以后,会有2种情况的跳跃。一种跳到了Component.class下的processMouseEvent方法,另一种跳到了AWTEventMulticaster.class下的mouseReleased方法,其中第二种方法会导致mousereleased这个事件被重复调用。这是什么原因呢。求高手解答!!

解决方案 »

  1.   

    因为还有 mouseClicked 事件
    之所以有的时候这样,有的时候不是这样
    是因为 mouseClicked 要求鼠标按下与松开在同一坐标
    不是每次都会触发
    mouseReleased 中执行的代码不会因为这样重复调用的
      

  2.   

    根据我提的问题,写了个测试代码,大家可以实践用一下;刚开始单击绿色地方,只打印一个1.之后每点击按钮一次,单击绿色地方时所打印的1会多一个。分别调试会出现我上面所说的问题。import java.awt.Color;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JButton;
    import javax.swing.JFrame;
    public class B extends JFrame implements ActionListener{ private Container pane=null;
    private JButton jb=new JButton("123");
    public void aa(){
    }
    public B(){
    setSize(300, 300);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pane = this.getContentPane();
    pane.setLayout(null);
    pane.setBackground(new Color(0, 112, 26));
    jb.setBounds(100,100,60,20);
    pane.add(jb);
    jb.addActionListener(this);
    new A(this);
    }
    public static void main(String[] args) {
    new B();
    }
    public void actionPerformed(ActionEvent e) {
    new A(this);
    }

    }import java.awt.Container;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    public class A { private Container pane=null;
    public A(B b){
    this.pane=b.getContentPane();
    pane.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e){
    System.out.println(1);
    }
    });
    }
    }
      

  3.   

    god.....
    你每点击一次按钮就会
    new A(this);
    然后就给你的pane添加了一个新的mouseListener...
    mouseListener可以叠加的
    在Component中表现为一个mouseListener数组当然每点一次按钮之后,就会造成多次打印了啊
    你多点几次按钮试试,一下打印一堆出来
      

  4.   

    哦,理解了。刚刚试了试解决方法,在add前加了个removeMouseListener,可还是有这个情况。这个测试程序是我从项目中分离出的,必须这样做,有什么解决方法么?
      

  5.   

    如果只能改A那:import java.awt.Container;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    public class A {    private Container pane=null;
        public A(B b){
            this.pane=b.getContentPane();
            if (pane.getMouseListeners().length == 0) {
            pane.addMouseListener(new MouseAdapter() {
                public void mouseReleased(MouseEvent e){
                    System.out.println(1);
                }
            });
            }
        }
    }
      

  6.   

    如果只能改B,那import java.awt.Color;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JButton;
    import javax.swing.JFrame;
    public class B extends JFrame implements ActionListener{    private Container pane=null;
        private JButton jb=new JButton("123");
        public void aa(){
        }
        public B(){
            setSize(300, 300);
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            pane = this.getContentPane();
            pane.setLayout(null);
            pane.setBackground(new Color(0, 112, 26));
            jb.setBounds(100,100,60,20);
            pane.add(jb);
            jb.addActionListener(this);
            new A(this);
        }
        public static void main(String[] args) {
            new B();
        }
        public void actionPerformed(ActionEvent e) {
            //new A(this);不要每次都new一个A
        }
        
    }