mousereleased事件的一个疑问

洛风释 2010-11-18 05:25:18
我通过debug调试一个程序,发现每次执行完mousereleased以后,会有2种情况的跳跃。一种跳到了Component.class下的processMouseEvent方法,另一种跳到了AWTEventMulticaster.class下的mouseReleased方法,其中第二种方法会导致mousereleased这个事件被重复调用。这是什么原因呢。求高手解答!!
...全文
296 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyiz 2010-11-19
  • 打赏
  • 举报
回复
如果只能改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
}

}
sunyiz 2010-11-19
  • 打赏
  • 举报
回复
如果只能改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);
}
});
}
}
}
洛风释 2010-11-19
  • 打赏
  • 举报
回复
sunyiz,非常感谢!
洛风释 2010-11-18
  • 打赏
  • 举报
回复
哦,理解了。刚刚试了试解决方法,在add前加了个removeMouseListener,可还是有这个情况。这个测试程序是我从项目中分离出的,必须这样做,有什么解决方法么?
sunyiz 2010-11-18
  • 打赏
  • 举报
回复
god.....
你每点击一次按钮就会
new A(this);
然后就给你的pane添加了一个新的mouseListener...
mouseListener可以叠加的
在Component中表现为一个mouseListener数组

当然每点一次按钮之后,就会造成多次打印了啊
你多点几次按钮试试,一下打印一堆出来
洛风释 2010-11-18
  • 打赏
  • 举报
回复
回复1楼:貌似你说的和我遇到的问题不一样啊。。
洛风释 2010-11-18
  • 打赏
  • 举报
回复
根据我提的问题,写了个测试代码,大家可以实践用一下;刚开始单击绿色地方,只打印一个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);
}
});
}
}
sunyiz 2010-11-18
  • 打赏
  • 举报
回复
因为还有 mouseClicked 事件
之所以有的时候这样,有的时候不是这样
是因为 mouseClicked 要求鼠标按下与松开在同一坐标
不是每次都会触发
mouseReleased 中执行的代码不会因为这样重复调用的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧